2016-11-28 4 views
1

アプリケーションデリゲートからView Controllerに向ける正しい方法は何ですか?私はプッシュ通知を取得すると、私はビューコントローラにユーザーを移行していますが、ビューは完全ではありません。ナビゲーションバーが正しく表示されません。ここに私のセットアップがある:appdelegateからビューコントローラへのセグをたどる

tabviewcontroller (storyboard name is 'main') 
- nav1controller -> view1controller -? view1detailcontroller (storyboard name is 'view1detail') 
- nav2controller -> ... 

プッシュ通知が到着すると、私はveiw1detailcontrollerにユーザーを取るしたいと思います。ユーザーがview1controllerに戻ることを許可します。

これは私が持っているコードです:だから

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let mainViewController = storyboard.instantiateViewControllerWithIdentifier("main") as! UIViewController 

let view1detailcontroller = storyboard.instantiateViewControllerWithIdentifier("view1detail") as! view1detailcontroller 

let nav = UINavigationController(rootViewController: mainViewController) 
nav.pushViewController(view1detailcontroller, animated: true) 
self.window!.rootViewController = nav 

、それはview1detailcontrollerする罰金移行します。しかし、いったんview1controllerに戻ると、その画面のナビゲーションバーと他のすべての画面では「メイン」と表示され、すべてのナビゲーション項目も表示されません。

私は間違っていますか?

+0

どのようなこの1つの 'nav.pushViewController(view1detailcontroller、animated:true)の使用 ' –

+0

私はview1detailcontrollerに移行する必要があります – Prabhu

答えて

1

を、あなたは基本的に全体のビュー・スタックをリセットしています。 (たとえば、最初のビュー階層の見積もりに記載されているtabviewcontrollerが失われます)

代わりに、既存のタブビューコントローラとその子ナビゲーションコントローラにアクセスして、新しいView Controllerをプッシュします。どのようにこれを行うことができるかについてのさらなる助けが必要な場合は、既存の設定を理解するために、より多くのコード/ストーリーボードのスクリーンショットを共有する必要があります。

EDIT

あなたのコメントから、あなたのself.wondow.rootViewControllerが既にナビゲーションコントローラを含むあなたの「tabBarController」であること、(非常に明確ではないが)ようです。これを仮定すると、あなたがtabbarcontroller以内にあなたの意図したナビゲーションコントローラのインデックスを知っていることを、あなたはプッシュ通知アクセスtabBaController受信する階層

  1. であなたの意図したビューコントローラを開くには、次の手順を実行することができます

    とすると、tabBarController = self.window.rootViewControllerは?

  2. アクセスタブバーコントローラ内のナビゲーションコントローラUITabBarController:(コードが意図したナビゲーションコントローラは、最初のタブがあると想定し、あなたのセットアップに応じてコードにインデックスを変更します。)させた場合

    からNavController = tabBarController.viewControllers [0]として?

  3. UITabBarControllerこのナビゲーションコントローラにしたいすべてのビューコントローラの配列を作成し、setViewControllers方法を使用してそれらを設定します。

    のvar viewControllersArray:[のUIViewController] =のUIViewController; viewControllersArray.append(view1controller) viewControllersArray.append(view1detailcontroller) navController.setViewControllers(viewControllers:viewControllersArray、アニメーション:真)ここ

  4. 、あなたのコード形式のストーリーボードで行うようview1controllerview1detailcontrollerをインスタンス化し、次の点に注意してください。フォームsetViewControllers documentation

最後の項目は、アレイに添加さ ナビゲーションスタックの最上位項目なる

+0

おかげ。どのように私は、タブビューコントローラのナビゲーションコントローラにアクセスするのですか?私はこのような私のtabviewコントローラがあります:var mainViewController = storyboard.instantiateViewControllerWithIdentifier( "main")としてUIViewController self.window?.rootViewController = mainViewController – Prabhu

+0

待ちます!質問では、あなたのコードは、あなたが押してしようとしているコントローラを見るあなたのストーリーボード識別子として 'main'を記述しています。このコメントでは、あなたのtabviewcontrollerの識別子と言います。どちらですか? – lukya

+0

私のストーリーボードのtab viewcontollerの名前は 'main'です。これには2つのビューコントローラ(view1controllerとview1detailcontroller)を持つナビゲーションコントローラがあります。基本的には、戻るボタンとタブを維持しながら、ユーザーがview1detailcontrollerに行くようにします。 – Prabhu

0

メインストーリーボードから直接ビューコントローラーをプッシュするのではなく、topControllerまたはvisibleControllerを取得し、topControllerで必要なviewControllerをプッシュして、ViewControllerのスタックを維持し、必要なものを取得する必要があります。あなたは、この使用することができます

+0

いくつかのコードで私を助けてくれますか?私は迅速にすごいです。ありがとう! – Prabhu

+0

私はあなたが何をすべきかのようにalgoを書くことができます – devjangir

+0

まず、あなたのnavigationControllerである必要があります最初のウィンドウrootviewcontrollerを取得し、次にそれを使用する必要がありますようにalgoを書くことができるdetailViewControllerそれを使用してデータをプッシュUINavigationController UINavigationControllerのスタックコントローラのすべてのコントローラをトラバースしてdetailControllerのオブジェクトを取得し、このVCを使用してコードをプッシュします。 – devjangir

0

:新しいナビゲーションコントローラを作成し、self.window!.rootViewController = navを設定することにより

var rootViewController = self.window!.rootViewController as UINavigationController 
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("view") as ViewController 
    rootViewController.pushToViewController(viewController, animated: true) 
+0

これは、タブビューとナビゲーションスタックが保持されないという問題です。 – Prabhu

+0

次回ビューコントローラに設定することができる:viewWillAppear(:ブールアニメーション)FUNCオーバーライド{ super.viewWillAppear(アニメーション) self.navigationController .setNavigationBarHidden?(真、アニメーション:アニメーション) } – User511

関連する問題