[解決済み] iOS 5でView Controller Containmentはどのように機能するのか?
質問
WWDC 2011 セッション 102 で、Apple は View Controller Containment を発表しました。これは、カスタムビューコントローラーコンテナを作成する機能で、次のようなものです。
UITabBarController
,
UINavigationController
といった具合です。
例を何度か見てみました。このパターンに関連するメソッドが次々と出てきますが、それらを正確に把握するのは少し困難でした。私が考えることをここに投稿し、コミュニティが私の疑念を確認または否定するかどうか見てみようと思います。
シナリオ 1: 親なしから新しい親ビューコントローラーへの移動
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
最初の2行は、指定された順番でなければならないのでしょうか、それとも逆でもいいのでしょうか?
シナリオ2:親ビューコントローラから親ビューコントローラなしへの移動
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
を呼び出すことも必要でしょうか?
[vc didMoveToParentViewController:nil]
? セッション102の例では
はこれを行いませんでした。
を行いませんでしたが、それが省略されたのかどうかはわかりません。
シナリオ3:ある親ビューコントローラーから別の親ビューコントローラーに移動する
各親ビューコントローラのロジックはカプセル化されているため、これはおそらく次のように発生します。
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
質問
私の主な質問はこれです。一般的に、ビューコントローラの格納はこのように動作するのでしょうか?上に挙げた力学は正しいですか?
を呼び出す必要があるのでしょうか?
willMoveToParentViewController
を呼び出す前に
addChildViewController
? これは論理的な順序のように私には思えますが、厳密に必要なのでしょうか?
を呼び出すことは必要でしょうか?
didMoveToParentViewController:nil
を呼び出した後に
removeFromParentViewController
?
どのように解決するのですか?
この
UIViewController
をいつ呼んで、いつ呼ばないかについては、docs はかなり明確です。
willMove
/
didMove
のメソッドを使用します。 チェックアウトは
"コンテナ・ビュー・コントローラの実装"
のドキュメントを参照してください。
ドキュメントによると、もしオーバーライドしないなら
addChildViewController
をオーバーライドしなければ
willMoveToParentViewController:
メソッドを呼び出す必要はありません。 しかし
didMoveToParentViewController:
メソッドを呼び出す必要があります。 同様に、コンテナビューコントローラが
willMoveToParentViewController:
メソッドを呼び出す前に
removeFromParentViewController
メソッドを呼び出す前に その
removeFromParentViewController
メソッドは
didMoveToParentViewController:
メソッドを呼び出します。
また、ワークアウトした例として はこちら とサンプルコード はこちら .
グッドラック
関連
-
JenkinsがIOSを自動パッケージングしてモミを配布
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] NSの接頭辞はどういう意味ですか?
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UITableView - トップにスクロールする
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
-
[解決済み】iOSアプリの名前を変更する方法は?
-
[解決済み】iOSで最上位のビューコントローラーを見つける方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
制御が非ボイド関数の終了に達する
-
[解決済み] Xcode 6.3 - 現在の iOS Development 証明書または保留中の証明書要求がすでにあります。
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] iOS7でスタイルUITableViewStyleGroupedを持つUITableViewの上部に余分なパディングがあるのはなぜですか?
-
[解決済み] Objective-CでNSNotificationCenterを通してメッセージを送受信する?
-
[解決済み] SwiftでUIAlertViewを作成するにはどうしたらいいですか?
-
[解決済み] iOSシミュレータでスクリーンショットを撮る
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] ナビゲーションコントローラスタック、サブビュー、モーダルコントローラを使用せずに、ビューコントローラの変化をアニメーション化する?