我有一个视图控制器(这是我的应用程序的主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];
这一切都有效(在将它推入mainNavController的层次结构后,单击返回detailVC的navigationItem会返回到原始的rootViewController,MyViewController1),除非键盘在详细视图控制器中的屏幕上被切换,它得到隐藏,然后动画备份,而不是只停留在屏幕上(因为视图正在消失一秒钟,因为presentViewController解散模态导航控制器,其细节VC的一部分的层次结构,然后重新出现,因为它被推到mainNavController的堆栈,textView再次抓住第一响应者。
是否有更好的方法来更改详细视图控制器所属的导航层次结构,可能是一个不涉及视图消失的导航层次结构,因此键盘被隐藏并立即被重新显示?