因此,我在情节提要中设置了UINavigationController的普通rootViewController。每当我更换导航控制器时(不要问为什么,但是我的应用程序中的某些转换要求使用新的控制器替换整个堆栈)

var newController: UIViewController!
// newController is initiated at some point
...
if let navigationController = self.navigationController {
    navigationController.setViewControllers([newController])
}


而且我可以直观地看到发生了过渡,但是没有调用viewWillDisappear或viewDidDisappear方法。当我随后替换导航控制器堆栈时,将按预期方式调用它们。根有什么特别之处可以阻止它们被调用吗?

最佳答案

基本上,导航控制器作为控制器的堆栈工作,子控制器位于堆栈的顶部。

如果要从导航控制器中删除一组视图控制器,则应在其根目录上使用pop方法:

navigationController?.popViewController(animated: true)

这会将所有内容弹出堆栈,您将可以用其他控制器替换根。

这是另一个答案:How to detect if view controller is being popped of from the navigation controller?扩展了您必须检测到的何时弹出控制器的不同选项,例如使用isMovingFromParentViewController

10-07 19:05
查看更多