4

viewController がナビゲーション コントローラーにプッシュされた直後に、viewController のビューが読み込まれません。

これは私のコードスニペットです。

- (void)myMethodInClassA {
    // window's root view controller is navigation controller
    UINavigationController *naviCtrl = (UINavigationController*)[UIApplication sharedApplication].keyWindow.rootViewController;
    MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
    [naviCtrl pushViewController:myVC animated:NO];

    // at this point, myVC's view is NOT loaded
}

を呼び出すと、そのメソッドが返されたmyMethodInClassA後に myVCが呼び出されます。viewDidLoadナビゲーション コントローラーが呼び出された直後、pushViewController:animated:myMethodInClassA が戻る前に、myVC のビューが読み込まれると予想していました。

ビューコントローラーのビューが読み込まれるのはいつですか? Apple のドキュメントには、最初にアクセスしたときに読み込まれると書かれています。少しあいまいです。pushViewController:ナビゲーションコントローラーがビューコントローラーのビューにアクセスしないのはなぜですか?

ps 最初のあいまいな質問で申し訳ありません。

4

6 に答える 6

10

ビュー コントローラー (VC) をナビゲーション コントローラーのスタックにプッシュすると、VC がナビゲーション コントローラー (コンテナー ビュー コントローラー) の子ビュー コントローラーになります。このような子と親の関係を作成することは、子 VC のビューがすぐに読み込まれない個別の手順です。むしろ、コンテナー VC は後でビューをロードします。「後で」が何を意味するかについての明示的な仕様はないと思います。通常は、コンテナー VC が、子 VC のビューをコンテナー VC のビュー階層に統合する時期が来たと判断したときです。しかし、基本的には、コンテナ VC の実装の裁量で発生します。

そうは言っても、VC のプロパティにアクセスするだけで、誰でもVC のビューを強制的にロードできます。viewたとえば、コードに次の行を追加できます

myVC.view;

これがトリガーされloadView、次に.viewDidLoadMyViewController

ただし、MyViewControllerコンテナー VC に関連付けられているというイベントに対応する必要がある場合は、次のメソッドのいずれか (または両方) をオーバーライドすることをお勧めしますMyViewController

- (void) willMoveToParentViewController:(UIViewController*)parent
{
    // write your code here
}

- (void) didMoveToParentViewController:(UIViewController*)parent
{
    // write your code here
}

ただし、が親ナビゲーション コントローラーのスタックからポップされたときwillMoveToParentViewControllerdidMoveToParentViewControllerも呼び出されることに注意する必要があります。の引数をMyViewControllerチェックすることで、これが事実であることを検出できます。parentnil

于 2013-05-31T11:44:05.070 に答える
2

(Swift 2)この質問には受け入れられた回答がないため...

私がやったことは、子ビューコントローラーで便利な初期化を作成することです:

convenience init() {
    self.init(nibName: "ChildViewController", bundle: nil)
    //initializing the view Controller form specified NIB file
}

そして、parentViewController のviewDidLoad()で:

let commentsView = CommentsViewController()
self.addChildViewController(commentsView)
self.momentsScrollView.addSubview(commentsView.view)
commentsView.didMoveToParentViewController(self)
于 2016-01-29T22:57:23.553 に答える
1

上記のように、viewDidLoad は、ビューがプッシュされたときに 1 回呼び出されます。

于 2013-05-31T11:27:39.280 に答える
0

そのViewControllerがすでにnavigationControllerスタックにプッシュされている場合、ViewDidLoadメソッドは再度呼び出されません。そのViewControllerを初めてプッシュすると、viewDidLoadが呼び出されます。したがって、何らかの機能を毎回実行する必要がある場合は、viewController をプッシュするたびに呼び出されるため、viewWillAppear メソッドに実装します。

お役に立てば幸いです。

于 2013-05-31T03:34:43.387 に答える
0

最初の tym のビュー コントローラーをプッシュしていますか?YES の場合、コントローラーの viewDidLoad() のみが呼び出され、既にプッシュされていて、これが最初の tyn でない場合は、viewWillAppear () が呼び出されます。プッシュするたびに新しいインスタンスを作成すると、viewDidLoad()が呼び出されます。

于 2013-05-31T05:37:09.090 に答える