尽可能地,我想远离使用viewWillDisappear或viewDidDisappear,因为我在我的项目中使用一个splitview,并且在主视图中选择一个不同的行也将触发viewWillDisappear / viewDidDisappear方法.
解决方法
根据phatmann的反馈(下面的第一个评论),如果一年以前我回答了这个问题,有什么改变,我很好奇.我把一个简单的例子应用程序放在一起,并且有一些有趣的结果.
选项1,示例
https://github.com/greymouser/TestNVC
我没有能力轻松测试8.x之前的版本,所以我不知道自那以后有什么变化.然而,我最初描述的行为仍然发生.但是,由于把测试应用程序放在一起,我没有注意到我以前没有这样的奇怪.
如果我只是依赖{will,did} MoveToParentViewController,我注意到一个虚假的didMoveToParentViewController:在rootVC上推送第一个非rootVC时,调用parent!= nil(意味着它被添加,不被删除).我在原始答案的时候没有遇到这个问题,因为我通常在我的NVC上有“永久”rootVC,并没有在那里实现回调.请参阅示例应用程序,日志记录设置为LOG_WILL_DID_MTPVC(在ViewController.m中).这是一个编辑的空间 – 我看到的快照:
TestNVC[] -[vc(rootVC) willMoveToParentViewController [entering] TestNVC[] -[vc(rootVC) didMoveToParentViewController [entering] TestNVC[] -[vc(1) willMoveToParentViewController [entering] TestNVC[] -[vc(rootVC) didMoveToParentViewController [entering] # <-- this is odd TestNVC[] -[vc(1) didMoveToParentViewController [entering] ...
我原来的答案建议使用{will,did} MoveToParentViewController单独,因为它是一个“一站式”来处理这种行为.然而,现在我看到对rootVC的虚假调用,我建议混合使用{will,done} MoveToParentViewController以及标准的UINavigationControllerDelegate回调.对于示例应用程序中的此行为,请将日志记录设置为LOG_WILL_DID_MTPVC_LEAVING_AND_NVC_WILL_DID_SHOW_VC.现在我们看到如下:
TestNVC[] -[nvcD willShowViewController]: rootVC TestNVC[] -[nvcD didShowViewController]: rootVC TestNVC[] -[nvcD willShowViewController]: 1 TestNVC[] -[nvcD didShowViewController]: 1 TestNVC[] -[nvcD willShowViewController]: 2 TestNVC[] -[nvcD didShowViewController]: 2 TestNVC[] -[vc(2) willMoveToParentViewController [leaving] TestNVC[] -[nvcD willShowViewController]: 1 TestNVC[] -[vc(2) didMoveToParentViewController [leaving] TestNVC[] -[nvcD didShowViewController]: 1 TestNVC[] -[vc(1) willMoveToParentViewController [leaving] TestNVC[] -[nvcD willShowViewController]: rootVC TestNVC[] -[vc(1) didMoveToParentViewController [leaving] TestNVC[] -[nvcD didShowViewController]: rootVC
…这样现在更有意义了.
选项2
另一个我没有探索的选项是使用您的NVC子字体,覆盖 – pushViewController:animated:和 – popViewControllerAnimated :,并应用您想要的VC所要求的任何行为,或从弹出窗口返回的VC. (如果您尝试这样做,请务必记住在覆盖中调用super.)
更新总结
所以,感谢phatmann有机会去看这个.我认为我的答案现在更加正确.不过,我并不确定这是“完全不真实的”.