Swift 4:关闭不执行

时间:2017-11-17 06:03:27

标签: ios swift

首先让我说我已经尝试了解决这个问题的所有事情,我不能为我的生活弄清楚。

代码:

 self.messagesControl?.showChatController()

没有运行,它在一个dismiss()闭包内,为什么后面的打印行运行,而不是上面的代码行?请帮忙!

messagesControl方法调用

 var messagesControl : MessagesViewController?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        self.dismiss(animated: true, completion: {
            self.messagesControl?.showChatController()
            print("dismiss closure finished running")
        })

}

showChatController()

 func showChatController()
{
    performSegue(withIdentifier: "goToChatLogControllerPlz", sender: self)
}

预期结果 segue运行打印行执行

观察到的结果:

打印行执行。没有segue :(

修改

我已经取代:

self.messagesControl?.showChatController()

使用:

      self.performSegue(withIdentifier: "showChatController", sender: self)

仍然得到相同的结果:(

3 个答案:

答案 0 :(得分:0)

苹果解雇的方式很奇怪。您可以在演示的VC或演示者上调用它。你在这做什么?如果你在呈现的视图控制器上调用它,那么它会在关闭后离开内存,并且在任何情况下它都不应该显示下一个视图控制器;父母应该。

有三种方法可以解决这个问题:

  1. 使用展开segue。当父母得到放松时,它会打电话 像你一样,在竞争处理程序中解雇并执行segue 现在。
  2. 使用委托并在模态showu; d被解雇时告诉父母。父母然后调用dismiss并启动segue。
  3. 在解雇之前到达UIResponder链以找到您的父VC。完成对您的父VC的解雇调用performSegue。
  4. 如果只有模态的最终状态是相关的(即你不需要其他任何委托),方法1是首选的。如果您已经使用委托代替其他内容,则首选方法2。方法3是最少的代码,但除非您的父VC符合您可以调用的某些标准协议,否则它通常很差。

答案 1 :(得分:0)

您可以使用UINavigationController.popViewController(:)。

在您的封尾中添加:

TIME

关闭VC时,它将应用反向动画。

答案 2 :(得分:-1)

问题在于您正在尝试执行不再存在的View Controller的segue。你应该做的是将segue连接到有问题的视图控制器的父节点,让父视图控制器执行segue。您的代码看起来像这样

var messagesControl : MessagesViewController?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    dismiss(animated: true, completion: { [weak self]
        self?.parent?.showChatController()
    })
}

在父视图控制器

func showChatController(){
    performSegue(withIdentifier: "goToChatLogControllerPlz", sender: self)
}