From ca3946a0cb0203dee97cd5c616112b5aeac1d916 Mon Sep 17 00:00:00 2001 From: Juan Cruz Ghigliani Date: Sun, 24 Apr 2016 09:36:20 -0300 Subject: [PATCH 1/2] Add MakeRoot NAvigation --- Sources/URLNavigator.swift | 47 +++++++++++++++++++++++++++++ Tests/URLNavigatorPublicTests.swift | 11 ++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Sources/URLNavigator.swift b/Sources/URLNavigator.swift index 68d37e3..4650b98 100644 --- a/Sources/URLNavigator.swift +++ b/Sources/URLNavigator.swift @@ -84,6 +84,7 @@ public class URLNavigator { } } + public var window:UIWindow? // MARK: Initializing @@ -317,6 +318,52 @@ public class URLNavigator { return false } + // MARK: Make Root + public func makeRootURL(URL: URLConvertible, + from: UIWindow? = nil, + animated: Bool = true, + wrap: Bool = false) -> UIViewController?{ + guard let fromWindow:UIWindow = self.window ?? from else{ + return nil + } + + guard let viewController = self.viewControllerForURL(URL) else { + return nil + } + + return self.makeRoot(viewController,from: fromWindow, animated:animated, wrap:wrap) + } + + public func makeRoot(viewController: UIViewController, + from: UIWindow? = nil, + animated: Bool = true, + wrap: Bool = false) -> UIViewController?{ + + + var finalViewController = viewController + if wrap && !viewController.isKindOfClass(UINavigationController){ + let navigationController = UINavigationController(rootViewController: viewController) + finalViewController = navigationController + } + + guard let snapShot:UIView = self.window?.snapshotViewAfterScreenUpdates(true) else{ + return nil + } + + finalViewController.view.addSubview(snapShot) + self.window?.rootViewController = viewController; + UIView.animateWithDuration(animated ? 0.6 : 0 , + delay: 0, + options: UIViewAnimationOptions.CurveEaseInOut, + animations: { () -> Void in + snapShot.layer.opacity = 0; + }) { (finished) -> Void in + snapShot.removeFromSuperview() + } + + return viewController + + } // MARK: Utils diff --git a/Tests/URLNavigatorPublicTests.swift b/Tests/URLNavigatorPublicTests.swift index 8e8083b..1d3109f 100644 --- a/Tests/URLNavigatorPublicTests.swift +++ b/Tests/URLNavigatorPublicTests.swift @@ -107,13 +107,22 @@ class URLNavigatorPublicTests: XCTestCase { XCTAssertTrue(self.navigator.openURL("myapp://ping")) self.waitForExpectationsWithTimeout(1, handler: nil) } - + func testOpenURL_URLNavigable() { self.navigator.map("myapp://user/", UserViewController.self) XCTAssertFalse(self.navigator.openURL("myapp://user/1")) } + + func testMakeRoot() { + self.navigator.window = UIWindow() + self.navigator.window?.rootViewController = UIViewController() + self.navigator.map("myapp://user/", UserViewController.self) + self.navigator.makeRootURL("myapp://user/1",animated:false) + XCTAssert(self.navigator.window?.rootViewController is UserViewController) + } + // MARK: Scheme func testSetScheme() { From 6f51ba5da9838ccb90bbbac5546ab720f4eafd3d Mon Sep 17 00:00:00 2001 From: Juan Cruz Ghigliani Date: Sun, 24 Apr 2016 09:52:43 -0300 Subject: [PATCH 2/2] MakeRoot fix wrap --- Sources/URLNavigator.swift | 2 +- Tests/URLNavigatorPublicTests.swift | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/URLNavigator.swift b/Sources/URLNavigator.swift index 4650b98..1170a07 100644 --- a/Sources/URLNavigator.swift +++ b/Sources/URLNavigator.swift @@ -351,7 +351,7 @@ public class URLNavigator { } finalViewController.view.addSubview(snapShot) - self.window?.rootViewController = viewController; + self.window?.rootViewController = finalViewController; UIView.animateWithDuration(animated ? 0.6 : 0 , delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, diff --git a/Tests/URLNavigatorPublicTests.swift b/Tests/URLNavigatorPublicTests.swift index 1d3109f..67d0110 100644 --- a/Tests/URLNavigatorPublicTests.swift +++ b/Tests/URLNavigatorPublicTests.swift @@ -118,8 +118,9 @@ class URLNavigatorPublicTests: XCTestCase { self.navigator.window = UIWindow() self.navigator.window?.rootViewController = UIViewController() self.navigator.map("myapp://user/", UserViewController.self) - self.navigator.makeRootURL("myapp://user/1",animated:false) - XCTAssert(self.navigator.window?.rootViewController is UserViewController) + + XCTAssert(self.navigator.makeRootURL("myapp://user/1", wrap:true ,animated:false) is UserViewController) + XCTAssert(self.navigator.window?.rootViewController is UINavigationController) }