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 方法。

最后要考虑的情况是当你想从 sideNavigationControllerNavigationController 的 rootViewController 中加载一个新的 UIViewController 时。为此,假设 sideNavigationController 的 rootViewController 是 NavigationController,您需要这样做:

(sideNavigationController?.rootViewController as? NavigationController)?.pushViewController(MySecondViewController(), animated: true)

这应该能帮到你 :)