在 Swift 中使用 UIAlertViewController 时无法从 shouldPerformSegue 返回控制

Posted

技术标签:

【中文标题】在 Swift 中使用 UIAlertViewController 时无法从 shouldPerformSegue 返回控制【英文标题】:Cant return control from shouldPerformSegue when using UIAlertViewController in Swift 【发布时间】:2016-09-27 16:34:45 【问题描述】:

我在 shouldPerformSegue 中使用以下代码。我想根据用户是选择删除还是取消来停止或继续 segue。

我注意到 segue 由于警报而停止。如果我删除警报,则 segue 可以正常工作。

shouldPerformSegue 使用此类验证的位置是否不正确?

谢谢。

let alertController = UIAlertController(title: "Confirm Delete", message: "Are you sure?", preferredStyle: UIAlertControllerStyle.alert)

let deletelAction = UIAlertAction(title: "Delete", style: UIAlertActionStyle.destructive)  (result : UIAlertAction) -> Void in
            print("Delete")

    if self.selection != nil     
        if self.selection!.delete() == true  //this is database call
            self.success =  true
         else 
            self.success =  false
    
         
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel)  (result : UIAlertAction) -> Void in
    print("Cancelled delete")
    self.success =   false

alertController.addAction(deletelAction)
alertController.addAction(cancelAction)
self.present(alertController, animated: true, completion: nil)

return success

【问题讨论】:

您在闭包中将success 设置为true/false,因此您应该使用回调而不是return 方法。 Santosh,我还没用过回调,所以需要先学习。会退房的。 【参考方案1】:

感谢Paulw11 到this question 的评论,我找到了答案。

所以我从 Delete bar 按钮中删除了 unwind segue,并从 View Controller 添加到 Exit。然后我从删除操作方法中以编程方式调用这个 segue。这行得通。

但是我注意到 shouldPerformSegue 没有被调用。原因在this link 由nburk 解释,如果以编程方式调用segue,则不会调用shouldPerformSegue。这真是苹果工程师的聪明:)

【讨论】:

以上是关于在 Swift 中使用 UIAlertViewController 时无法从 shouldPerformSegue 返回控制的主要内容,如果未能解决你的问题,请参考以下文章

swift 优雅地处理Swift中可本地化的字符串。注意:此代码在Swift 2中,需要在现代Swift中使用更新。

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类

如何在 Swift 中使用 Apple 地图 - 你必须使用 C 还是 Swift 可以?

swift 在swift中使用javascriptcore

swift 在swift中使用枚举练习