我有一个视图控制器(它是我的应用程序的主 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 再次抓住第一响应者)。
有没有更好的方法来更改详细视图控制器所属的导航层次结构,可能不涉及视图消失,因此键盘被隐藏并立即重新显示?