2016-04-07 4 views
0

私はCosmicMindによってMaterial Frameworkを使用しています。現在、SideNavigationControllerで行が選択されたら、ViewControllerを置き換えようとしています。残念ながら、私はこれを行う方法を理解することはできません。 StackOverflow(#1)にも同様の質問がありますが、残念ながら解決策は私のためには機能しません。 AppDelegate.swiftクラスの私のコードに続いてSideNavigationController - NavigationControllerのrootViewControllerを置き換えます

:このコードのすべてを

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(MyViewController)が表示されます。
MyViewControllerMySecondViewControllerに置き換えようとしていますが、これは機能しません。次のコード私が使用してきた:

sideNavigationController?.transitionFromRootViewController(MySecondViewController()) 

結果は、ツールバーが消えて、私はもうSideNavigationControllerを閉じることができないということです。このコードでは

let navigationController: NavigationController = AppNavigationController(rootViewController: MySecondViewController()) 
sideNavigationController?.transitionFromRootViewController(navigationController) 

ツールバーが再び表示されているが、SideNavigationControllerに問題が残っている - >意味:だから私は、次の試してみたそれを閉じることができません。

TL; DR
にはどうすれば適切にNavigationControllerのrootViewControllerを交換するのですか?

答えて

1

NavigationControllerは、UINavigationControllerのサブクラスです。 rootViewControllerを変更するのは、iOSが作ったものです。例:

navigationController?.pushViewController(MySecondViewController(), animated: true) 

SideNavigationControllerは、そのrootViewControllerを移行する機能を提供します。 SideNavigationControllerが子のUIViewControllerを使用し、要求されたときにSideNavigationControllerをスワップするので、これは異なります。たとえば、

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) 

これはあなたを助ける必要があります:)

+0

を迅速かつ総合的な答えてくれてありがとう。問題は、私が「pushViewController」アプローチを使用すると、私はツールバーに「バックキャレット」を持ち、以前に表示されたViewControllerは置き換えられませんが、バックスタックに置かれます。 SideNavigationController、それじゃない? – user3420815

+1

はい、私は、SideNavigationControllerからアイテムが選択されたときに、backButtonが表示されるとは思わないでしょう。ここで私はそれを見ています。 NavigationControllerはUIViewControllerのサブクラスであるUINavigationControllerのサブクラスです。これは、それが何となく終わりにUIViewControllerであることを意味します。 「複数のナビゲーションスタックを使用することはできません」というルールはありません。つまり、SideNavigationControllerからのナビゲーションフローを起動する場合、独自のスタックを持つ新しいNavigationControllerを簡単に起動できます。 – CosmicMind

+0

これで、rootViewController(例:* MySecondViewController *)で新しい 'NavigationController'を作成し、' sideNavigationController?.transitionFromRootViewController(newNavController) 'を呼び出す必要があると言っていますか? – user3420815

関連する問題