我试图在确认警报后移至下一个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
错误。显然,在警报框中按确认后,它只能进行一次检测。
我在网上发现了类似的问题,但大多数似乎都缺少情节提要的一部分,我应该在两个视图之间建立链接还是应该以编程方式全部完成?如果仅以编程方式完成,我应该如何识别下一个视图控制器?
答案 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以查看控制器?
答案 1 :(得分:0)
您为什么需要CATransaction
?您不是自己制作动画。您不需要CATransaction
,也不需要setCompletionBlock
。
警报和segue都有自己的动画。我怀疑您的完成块是由它们触发的多个动画的完成触发的。
如果您只想确保自己在主队列中执行操作,则可以改用DispatchQueue.main.async
。