2016-04-25 24 views
3

UINavigationでViewControllerをプッシュすることと、次のビューで値を変更するという観点からViewControllerをモーダルに提示することの意味は何ですか?navigationController!.pushViewControllerとiOS SwiftのpresentViewControllerとの比較

たとえば、最初の作品はなぜ2番目の作品ではないのですか?

まず:

var textController: TextViewController 
textController = self.storyboard!.instantiateViewControllerWithIdentifier("TextViewController") as! TextViewController 
presentViewController(textController, animated: false, completion: nil) 
textController.textDetail.text = Categories[indexPath.row] 

第二:

var textController: TextViewController 
textController = self.storyboard!.instantiateViewControllerWithIdentifier("TextViewController") as! TextViewController 
self.navigationController!.pushViewController(textController,animated:true) 
textController.textDetail.text = Categories[indexPath.row] 

私はナビゲーションスタックにプッシュするとき、ラベルの値を変更することができません。

+0

1.どのように 'textController'をインスタンス化していますか? 2.どのように 'textDetail'をインスタンス化していますか? 1. textControllerがUIViewControllerであると仮定します。2.両方のケースでこのコードの前に 'textController'をインスタンス化しただけです。3.' textDetail'はIBOutletで、 'textController'の初期化処理中にインスタンス化されません。どちらの場合でもテキスト値を設定することはできません。後でView Controllerのライフサイクルを待つ必要があります。 –

+0

私はそれをインスタンス化するコードを追加しました。最初のものはラベルの値を変更しますが、2番目のものはアンラップエラーです –

+0

アンラッピングエラーはどこで発生していますか?これは、 'self.navigationController!.pushViewController(textController、animated:true)'の行で発生していますか?そうでない場合:viewControllerコード内の同じ場所にこれら2つのコードブロックが発生していますか?どのように 'textDetail'をインスタンス化していますか? –

答えて

2

presentViewControllerメソッドを呼び出すと、ビューコントローラのビューが実際に呼び出されますが、ナビゲーションコントローラのpushViewControllerを呼び出すと、呼び出し後にビュー自体が読み込まれるように見えます。

これは、View Controllerのプレゼンテーション/プッシュと、TextViewControllerのviewDidLoadメソッドでのコンソールへの印刷前後で、コンソールに印刷することでテストできます。

ビューがロードするtextDetail変数のためにロードする必要があります(あなたがそう言っていないが、私は、これはIBOutletであると仮定しています)とtextDetail変数は、あなたがそのtextを変更できるようにするためにロードする必要がありますプロパティ。

あなたがたとえば、あなたのTextViewControllerクラスに変数を設定することができpushViewControllerを使用して、あなたがしてtextDetail変数のテキストプロパティを設定することができ、そのviewDidLoadメソッドをオーバーライドします。

関連する問題