SideNavigationController - 替换 NavigationController 的 rootViewController
SideNavigationController - Replace rootViewController of NavigationController
我正在使用 Material Framework by CosmicMind. Currently I'm trying to replace the ViewController
once a row is selected in the SideNavigationController
. Unfortunately I can't figure out how to do this. There're similar question here on Whosebug (#1) 不幸的是这些解决方案对我不起作用。
按照我在 AppDelegate.swift
class 中的代码:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myViewController = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
let navigationController: NavigationController = AppNavigationController(rootViewController: myViewController)
let sideNavigationController: SideNavigationController = SideNavigationController(rootViewController: navigationController, leftViewController: AppLeftViewController())
// further code
return true
}
使用此代码一切正常。显示 ViewController(我的ViewController)。
现在我试图用 MySecondViewController 替换 MyViewController 但这不起作用。按照我一直在使用的代码:
sideNavigationController?.transitionFromRootViewController(MySecondViewController())
结果是工具栏消失了,我无法再关闭 SideNavigationController。所以我尝试了以下方法:
let navigationController: NavigationController = AppNavigationController(rootViewController: MySecondViewController())
sideNavigationController?.transitionFromRootViewController(navigationController)
使用此代码,工具栏再次可见,但 SideNavigationController 的问题仍然存在 -> 意味着:它无法关闭。
tl;dr
如何正确替换 NavigationController 的 rootViewController?
NavigationController
是UINavigationController的子类。所以改变 rootViewController 就像 iOS 做的那样。例如:
navigationController?.pushViewController(MySecondViewController(), animated: true)
SideNavigationController
提供了转换其 rootViewController 的能力。这是不同的,因为 SideNavigationController 使用子 UIViewController 并在被询问时交换它们。例如:
sideNavigationController?.transitionFromRootViewController(MySecondViewController())
有时候,人们使用sideNavigationController
来提早。例如,您实例化一个新的 UIViewController,并将 sideNavigationController
代码放在 videDidLoad
方法中。这将不起作用,因为新的 UIViewController 尚未添加到 sideNavigationController
视图层次结构中。要解决此问题,请使用 viewWillAppear
方法。
最后要考虑的情况是当你想从 sideNavigationController
的 NavigationController
的 rootViewController 中加载一个新的 UIViewController 时。为此,假设 sideNavigationController
的 rootViewController 是 NavigationController
,您需要这样做:
(sideNavigationController?.rootViewController as? NavigationController)?.pushViewController(MySecondViewController(), animated: true)
这应该能帮到你 :)
我正在使用 Material Framework by CosmicMind. Currently I'm trying to replace the ViewController
once a row is selected in the SideNavigationController
. Unfortunately I can't figure out how to do this. There're similar question here on Whosebug (#1) 不幸的是这些解决方案对我不起作用。
按照我在 AppDelegate.swift
class 中的代码:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myViewController = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
let navigationController: NavigationController = AppNavigationController(rootViewController: myViewController)
let sideNavigationController: SideNavigationController = SideNavigationController(rootViewController: navigationController, leftViewController: AppLeftViewController())
// further code
return true
}
使用此代码一切正常。显示 ViewController(我的ViewController)。
现在我试图用 MySecondViewController 替换 MyViewController 但这不起作用。按照我一直在使用的代码:
sideNavigationController?.transitionFromRootViewController(MySecondViewController())
结果是工具栏消失了,我无法再关闭 SideNavigationController。所以我尝试了以下方法:
let navigationController: NavigationController = AppNavigationController(rootViewController: MySecondViewController())
sideNavigationController?.transitionFromRootViewController(navigationController)
使用此代码,工具栏再次可见,但 SideNavigationController 的问题仍然存在 -> 意味着:它无法关闭。
tl;dr
如何正确替换 NavigationController 的 rootViewController?
NavigationController
是UINavigationController的子类。所以改变 rootViewController 就像 iOS 做的那样。例如:
navigationController?.pushViewController(MySecondViewController(), animated: true)
SideNavigationController
提供了转换其 rootViewController 的能力。这是不同的,因为 SideNavigationController 使用子 UIViewController 并在被询问时交换它们。例如:
sideNavigationController?.transitionFromRootViewController(MySecondViewController())
有时候,人们使用sideNavigationController
来提早。例如,您实例化一个新的 UIViewController,并将 sideNavigationController
代码放在 videDidLoad
方法中。这将不起作用,因为新的 UIViewController 尚未添加到 sideNavigationController
视图层次结构中。要解决此问题,请使用 viewWillAppear
方法。
最后要考虑的情况是当你想从 sideNavigationController
的 NavigationController
的 rootViewController 中加载一个新的 UIViewController 时。为此,假设 sideNavigationController
的 rootViewController 是 NavigationController
,您需要这样做:
(sideNavigationController?.rootViewController as? NavigationController)?.pushViewController(MySecondViewController(), animated: true)
这应该能帮到你 :)