2

これは私を際限なく困惑させます。

あなたが言う:

[self.view addSubview: someController.view];

someController は、ビューが読み込まれていることをどのように認識し、viewDidAppear などを呼び出すのですか?

渡すのはビューであり、コントローラーではありません。それでも someController は知っています。

また、self.view 自体がウィンドウのビュー階層にない場合はどうなりますか。someController の viewWillAppear などは呼び出されますか?

これを実装する 1 つの方法は、コントローラーへの弱いポインター (デリゲートなど) を持つようにビューを設定し、ビュー自体がウィンドウ オブジェクトの子孫であるかどうかを確認することです。

これは実際に実装されている方法ですか?そうでない場合、実際にどのように行われますか?そうでなくても、そのように実装されていると考えるのは正しいですか?

私の懸念は次のとおりです。このviewWillAppearがどのように表示されるかを理解したいので、興味があります。なぜ呼び出されたのか、呼び出されなかったのかを明示的に知らないIOSを呼び出して何ヶ月も遊んでいました。viewWillAppear/Disapear が呼び出されるか呼び出されないかについて不平を言う投稿がたくさんあります。2回呼ばれる人もいます。いつどのように呼び出されるかを正確に知りたいです。私はそれが得意になっていますが、まだそこまでではありません。

4

1 に答える 1

2

UIKitのソースコードを見たことがありませんが、ご想像のとおり、UIViewにはUIViewControllerへのプライベート参照があります。これは、UIResponderのドキュメントで確認されています。UIViewとUIViewControllerの両方がレスポンダーチェーンに参加しているため、ビューのnextResponderメソッドを呼び出すことで、ビューからコントローラーへの参照を取得できます(強調鉱山)。

UIResponderクラスは、次のレスポンダーを自動的に保存または設定せず、代わりにデフォルトでnilを返します。サブクラスは、次のレスポンダーを設定するためにこのメソッドをオーバーライドする必要があります。UIViewは、このメソッドを管理するUIViewControllerオブジェクト(存在する場合)またはそのスーパービュー(存在しない場合)を返すことにより、このメソッドを実装します。UIViewControllerは、ビューのスーパービューを返すことによってメソッドを実装します。UIWindowはアプリケーションオブジェクトを返し、UIApplicationはnilを返します。

viewWillAppear:他の質問については、ビューが実際に表示されない限り、呼び出されることはないと思います。つまり、ビューがウィンドウのビュー階層にない限り、そうではありません。(これをテストするための簡単なデモプロジェクトを簡単に作成できます。)

于 2012-10-26T06:15:17.530 に答える