解雇呈现的视图控制器将无效。

8

我在我的项目中有一个比较复杂的模态segue设置。我试图关闭之前呈现的另一个视图控制器。我使用以下代码实现:

if(self.presentedViewController != nil){
    print(self.presentedViewController!)
    self.presentedViewController!.dismiss(animated: false)
    print(self.presentedViewController!)
}
print用于调试目的。它们显示presentedViewController实际上没有被关闭。 尽管我将animated设置为false,但当调用dismiss时,我仍然看到应用程序中发生动画。 然而,VC实际上并没有被关闭。 有人知道解决方案吗?

你可能想要发布你的故事板图片。 - Xcoder
一个更好的检查视图控制器是否已被释放的方法是 deinit { print("great success") } - lurning too koad
正如sconewolf所提醒的那样,如果你想要关闭当前的视图控制器,只需要执行dismiss(animated: false),而不是presentedViewController!.dismiss(animated: false)。后者只会关闭它自己所呈现的视图控制器,如果该视图控制器已经呈现了其他视图控制器,这些视图控制器将不会被关闭。通过在呈现视图控制器的VC上调用dismiss方法,可以关闭所有已经呈现的视图控制器(包括其子视图控制器)。 - Rob
1个回答

13

苹果

呈现视图控制器负责解除显示的视图控制器。如果在呈现的视图控制器本身上调用此方法,UIKit会要求呈现视图控制器处理解除操作。

dismiss(animated:completion:) 解除通过视图控制器模态呈现的视图控制器。

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss

例如,如果您从应用程序的根视图控制器中呈现视图控制器:

呈现视图控制器

let root = UIApplication.shared.keyWindow!.rootViewController!
root.present(someViewController, animated: true, completion: nil)
您可以这样从呈现的视图控制器中取消它:
呈现的视图控制器
let root = UIApplication.shared.keyWindow?.rootViewController
root?.dismiss(animated: true, completion: nil)

2
调用 root?.dismiss(animated: true, completion: nil) 并不会关闭根视图控制器,它只会关闭由该视图控制器模态呈现的视图控制器。这就是 dismiss(animated:completion:) 的作用。 - lurning too koad
完全正确。我改正了。我一直都是从展示视图控制器中进行调用(正如你所指出的那样,它会要求展示视图控制器来处理解除操作)。 - Rob
我得到了这个编译器错误:“在iOS应用程序扩展中,'shared'不可用:适当时使用基于视图控制器的解决方案。” 在扩展中使用UIApplication.shared已被弃用。 - Nikage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接