关闭 UINavigationController 并呈现另一个 UINavigationController

Posted

技术标签:

【中文标题】关闭 UINavigationController 并呈现另一个 UINavigationController【英文标题】:Dismissing a UINavigationController and Presenting another UINavigationController 【发布时间】:2016-01-02 20:59:17 【问题描述】:

我有两个视图控制器,ViewControllerAViewControllerB,嵌入在 UINavigationController 中。 ViewControllerA 有一个 UICollectionView 可以显示图像。

当位于索引 0 和 UICollectionViewCell 的相机图标被选中时,它应该关闭 ViewControllerA 并显示 ViewControllerB。此外,还有一个ViewController 以模态方式呈现ViewControllerA

这就是我所做的,但它只会关闭 ViewControllerA 并且没有任何反应

let controller = self.storyboard?.instantiateViewControllerWithIdentifier("cameraViewController") as! UINavigationController
        self.dismissViewControllerAnimated(true, completion:  () -> Void in
            self.presentingViewController?.presentViewController(controller, animated: true, completion: nil)
        )

【问题讨论】:

presentingViewController 为零吗? 它没有抛出任何错误。我通过添加断点来调试它。它运行了代码,只是没有对它做出反应 ***.com/questions/19857274/… 如果它是nil,它不会抛出错误,因为你使用self.presentingViewController?而不是self.presentingViewController!,如果它是nil,那很可能是问题的原因 - 试试打印self.presentingViewController,看看结果如何。 【参考方案1】:

当视图控制器被关闭时,我的猜测是self 已经被释放,所以self.presentingViewController? 也变成了nil。我会在取消操作发生之前创建一个对呈现视图控制器的强引用:

let presentingViewController = self.presentingViewController
self.dismissViewControllerAnimated(true)  completed in
  if completed 
    presentingViewController?.presentViewController(controller, animated: true, completion: nil)
  

另外,首先确保self.presentingViewController 不是nil

【讨论】:

在某处看到了这个。但是,忽略了它,这将是问题的原因。谢谢。【参考方案2】:

没有发生任何事情的原因是因为self.presentingViewController? 为零。

如果您使用的是self.presentingViewController!,则会出现错误提示在展开可选值时意外发现 nil,应始终避免这种情况。

使用self.presentingViewController? 而不是self.presentingViewController! 是正确的,因为它更安全,但要解决此问题,您必须确保self.presentingViewController? 不为零。

let presenting = self.presentingViewController

self.dismissViewControllerAnimated(true, completion: () -> Void in
    presenting?.presentViewController(controller, animated: true, completion: nil)
)

【讨论】:

以上是关于关闭 UINavigationController 并呈现另一个 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

打开和关闭 UINavigationController

如何正确关闭作为模式呈现的 UINavigationController?

使用 UINavigationController 关闭 UIPopoverController

UINavigationController 后退和关闭按钮

使用平移关闭 UINavigationController 调整 UINavigationBar 相对于顶部安全区域的大小

模态 UINavigationController 隐藏但不关闭