UINavigationController を提示することにより、別のビュー コントローラー階層をモーダルに提示するビュー コントローラー (アプリのメイン UINavigationController のルート ビュー) があります。ユーザーがモーダル NavController でルート ビュー コントローラーを操作した後、詳細 VC がモーダル NavController のスタックにプッシュされます。この詳細 VC とのやり取りの後、この詳細 VC を元の階層に戻し、モーダル NavController/そのルート ビュー コントローラーを閉じます。ユーザーがこの階層の変更を確認することはありません。今、私はこのようなものを持っています:
MyViewController1 (メインの NavController 階層のルート):
UINavigationController *newModalNavController = [[UINavigationController alloc]
initWithRootViewController:someRootViewController];
[self presentViewController:newModalNavController animated:YES completion:nil];
次に、上記の someRootViewController で、何らかの操作 (ボタンのクリックなど) の後、詳細ビュー コントローラーをモーダル階層にプッシュします。
[self.navigationController pushViewController:detailVC animated:YES];
最後に、detailVC で、さらにやり取りを行った後:
UINavigationController *mainNavController = /* Get main nav controller here (i.e. non-modal one) */
// Dismisses the modal view hierarchy (detailVC gets -(void)viewDidDisappear)
[self.presentingViewController dismissViewControllerAnimated:NO completion:nil];
// Repush the detailVC back onto the main hierarchy (detailVC gets -(void)viewDidAppear)
[mainNavController pushViewController:self animated:NO];
// Keyboard was on screen before interaction; make it stay on screen after pushing
// detailVC onto main nav hierarchy
[self.textView becomeFirstResponder];
これはすべて機能します (detailVC の navigationItem を mainNavController の階層にプッシュした後、元の rootViewController である MyViewController1 に戻る)。画面にとどまるのではなく、アニメーションをバックアップします (presentingViewController が、detailVC が含まれる階層のモーダル ナビゲーション コントローラーを閉じると、ビューが一瞬消えるため、mainNavController のスタックにプッシュされると再び表示されます)。 textView がファーストレスポンダを再度取得します)。
詳細ビュー コントローラーが含まれるナビゲーション階層を変更するより良い方法はありますか?