Swift:rootViewController 永远不会调用它的视图 [Will/Did]Disappear 方法

Posted

技术标签:

【中文标题】Swift:rootViewController 永远不会调用它的视图 [Will/Did]Disappear 方法【英文标题】:Swift: rootViewController never has its view[Will/Did]Disappear methods called 【发布时间】:2017-01-26 23:47:59 【问题描述】:

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

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

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

【问题讨论】:

我认为这是因为当您切换根控制器时视图实际上并没有消失。尝试在您要删除的视图上调用 dismiss(animated: false) Dismiss 不是指以模态方式呈现的视图吗? 【参考方案1】:

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

如果你想从导航控制器中移除一组视图控制器,你应该在它们的根目录上使用 pop 方法:

navigationController?.popViewController(animated: true)

这会将所有内容从堆栈中弹出,您将能够用其他控制器替换根。

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

【讨论】:

以上是关于Swift:rootViewController 永远不会调用它的视图 [Will/Did]Disappear 方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift:rootViewController 永远不会调用它的视图 [Will/Did]Disappear 方法

Swift/iOS13 - UIApplication.shared.delegate.window?.rootViewController?.present() 来自自定义类

Swift:当应用程序在后台运行时,无法使用 pushNotification 的信息刷新 rootViewController

Swift - 当应用程序进入后台状态时,从 AppDelegate 更新 RootViewController 中的值

swift RootViewController的差し替え时のメモリリーク対策

Swift didReceiveRemoteNotification - 无论app用户位于何处,都可以导航到rootviewcontroller(现在有错误信息)