无法从警报完成中弹出导航控制器:

Posted

技术标签:

【中文标题】无法从警报完成中弹出导航控制器:【英文标题】:Cannot pop back in Navigation controller from Alert completion: 【发布时间】:2018-06-19 17:54:01 【问题描述】:

Swift 4、XCode 9.4

我无法在 UIAlertController 完成(或什至接近)时弹回堆栈的根。

要求是向用户显示确认,然后直接转换回“主页”页面。当我尝试时,我总是得到类似的东西:

popToViewController:transition:在发生现有转换或演示时在 <UINavigationController 0x7fc4fe85f000> 上调用;导航堆栈不会更新。

我理解我想的概念。 UIAlertController 处于控制状态,或者导航控制器的控制能力不足,无法弹回。好的,因为我正在完成,所以有些道理。但是我不知道如何在不进入的情况下触发我的过渡。

@IBAction func doneAction(_ sender: Any) 

    if verifyDoneProperly() 

        let alert = UIAlertController(title: "Complete", message: "Good Job", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion:  

            if let nav = self.navigationController 
                nav.popToViewController(select, animated: true)
            
        )
    

FWIW,当我指定视图控制器时它也不起作用。

我已经仔细阅读了this answer,但没有什么能真正帮助我(AFAIK)。

我真正能想到的唯一事情就是向根控制器发送一条消息,并让它在转换回来后显示警报(也许检查viewWillAppear 中的标志)

肯定有正确的方法来做到这一点。任何人都可以提出一些建议吗?

重要提示:虽然我有故事板,但我不能在这里使用 segues。向“worker”视图控制器的转换以编程方式完成,并根据当前状态进行选择。

【问题讨论】:

【参考方案1】:

我不确定在视图控制器仍在呈现其他内容时弹出视图控制器是不是最好的主意。并且 presentcompletion 不会在视图控制器关闭后执行,只有在它完成演示后(即,在屏幕上可见)。

您可以在您的 OK 操作的 handler 中弹出您的视图控制器 - 这将在您的视图控制器不再显示警报后调用。

alert.addAction(UIAlertAction(title: "OK", style: .default, handler:  (_) in
    self.navigationController?.popToViewController(select, animated: true)
))

【讨论】:

【参考方案2】:

确保在下一个运行循环中执行弹出动画,方法是将其嵌入到调度块中:

DispatchQueue.main.async 
    self.navigationController?.popToViewController(select, animated: true)

【讨论】:

效果很好。相关问题的答案确实有一些调度队列,但他们做了一些事情,比如增加半秒......太丑了,不能成为正确的答案(希望如此) 这很有趣,因为警报下方的视图发生了变化。不是最佳的,但我可以忍受。 @Dilapidus 我认为这就是您想要实现的目标。你期待什么? 我希望在单击确定后发生转换。 在这种情况下,您必须使用 Samantha 的解决方案并使用警报操作的完成处理程序。现在你在警报的演示动画完成后弹出视图控制器(警报仍然可见)。

以上是关于无法从警报完成中弹出导航控制器:的主要内容,如果未能解决你的问题,请参考以下文章

无法从展开的 segue 动作中弹出

从导航堆栈推送/弹出uiviewcontroller时如何收到警报

有没有办法找出视图控制器是不是从导航堆栈中弹出?

如何从堆栈中弹出视图控制器而不导航到它们

如何在不使用导航栏的情况下从导航堆栈中弹出控制器

从堆栈中弹出导航控制器/创建双视图