在UIAlert之后执行Segue

时间:2019-02-06 12:15:59

标签: ios swift

我试图在确认警报后移至下一个ViewController。

@IBAction func yesBtn(_ sender: Any) {
    let dialogMessage = UIAlertController(title: "Confirm", message: "Are you sure?", preferredStyle: .alert)

    let ok = UIAlertAction(title: "Confirm", style: .default, handler: { (action) -> Void in
        print("Ok button tapped")
        self.saveRecord(Answer: "yes")
        CATransaction.setCompletionBlock({
            self.performSegue(withIdentifier: "mainUse", sender: nil)
        })
    })

    let cancel = UIAlertAction(title: "Cancel", style: .cancel) { (action) -> Void in
        print("Cancel button tapped")
    }

    //Add OK and Cancel button to dialog message
    dialogMessage.addAction(ok)
    dialogMessage.addAction(cancel)

    // Present dialog message to user
    self.present(dialogMessage, animated: true, completion: nil)
}

我已经在情节提要上添加了segue之后设法执行了segue,但是这会执行两次segue,一次是在按下“是”按钮时,另一次是在警报框中确认时。如果我删除情节提要上的segue,则根本不会执行segue。我还尝试通过将按钮拖动到下一个视图控制器,然后选择custom而不是show来创建自定义序列,但这会产生SIGABRT错误。显然,在警报框中按确认后,它只能进行一次检测。

我在网上发现了类似的问题,但大多数似乎都缺少情节提要的一部分,我应该在两个视图之间建立链接还是应该以编程方式全部完成?如果仅以编程方式完成,我应该如何识别下一个视图控制器?

2 个答案:

答案 0 :(得分:0)

您可以通过编程来实现。在这种情况下,无需在视图控制器之间建立链接。

let ok = UIAlertAction(title: "Confirm", style: .default, handler: { (action) -> Void in

    let vc = self.storyboard.instan... //get the destination view controller
    self.navigationController.push(vc, animated: true) //or you can present it using self.present(...) method
})
  

如果仅以编程方式完成操作,我应该如何识别下一个视图控制器?

     
    

当您从一个屏幕移动到另一屏幕时,总是会有您要移动的目标视图控制器。因此,您需要使用self.storyboard.instantia(...)方法从情节提要中获取该视图控制器

  

如何从情节提要中获取ViewController?

您可以通过以下方式

let destVC = UIStoryboard(name: "storyboard_name", bundle: nil).instantiateViewController(withIdentifier: "viewcontollerName_as_set_in_storyboard") as! DestinationViewController

如何设置情节提要ID以查看控制器?

enter image description here

答案 1 :(得分:0)

您为什么需要CATransaction?您不是自己制作动画。您不需要CATransaction,也不需要setCompletionBlock

警报和segue都有自己的动画。我怀疑您的完成块是由它们触发的多个动画的完成触发的。

如果您只想确保自己在主队列中执行操作,则可以改用DispatchQueue.main.async