UIAlertAction处理程序未调用

时间:2015-07-29 09:38:02

标签: ios swift uialertcontroller uialertaction

我有一个UITableView,在委托(视图控制器)中,我实现了函数

    tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
然后我测试编辑样式

    if editingStyle == UITableViewCellEditingStyle.Delete {
        // do deleting stuff here
    }

作为删除的一部分,我要求用户确认,如果他们选择“是”,则与该行相关的项目将被删除,如果他们选择否,则重置编辑样式。

  var alert = UIAlertController(title: "Delete Item", message: "Are you sure you want to delete the selected item?", preferredStyle: UIAlertControllerStyle.Alert)

  //delete
  alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.Destructive, handler: { (action: UIAlertAction!) -> Void in
      println("Yes action was selected")
      //delete my object and remove from the table
  }))

  //cancel
  alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: { (action: UIAlertAction!) -> Void in
      //reset editing
      println("Cancel action was selected")
      self.tableView.setEditing(false, animated: true)
  }))

  if self.presentedViewController == nil {
      presentViewController(alert, animated: true, completion: nil)
  }

我似乎遇到的问题是没有调用完成处理程序。我在其他地方使用过这种格式没有任何问题。

出现警告,标题,消息和“取消”和“是”按钮。如果我点击任何一个,没有任何反应。警报被取消,并且println语句没有控制台输出,并且肯定没有其他事情发生。我的删除代码不会执行“是”,并且不会为“取消”调用编辑重置。

我在应用程序中的其他tableviews上有相同的设置,它们按预期工作。

这是在一个视图控制器中,它是从另一个视图控制器以模态方式呈现的(如果有任何方位)。我没有收到任何其他正在进行的错误(因此if self.presentedViewController == nil阻止)。

我显然在某个地方出了问题,但此刻我却看不到哪里。有什么想法吗?

在8.4中使用IOS版本。目标是iPad。

4 个答案:

答案 0 :(得分:3)

检查您的ViewControllerchildViewController导航。如果导航覆盖:

(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^) (void))completion;

您必须致电super dismissViewControllerAnimated:flag completion:completion

确保参数completion无法通过nilUIAlertController会调用此方法(我也很困惑)。 我退出调用者是UIAlertController _dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:(再次混淆)。

它对我有用。我希望它对你也有用。

答案 1 :(得分:2)

我有同样的问题,我发现我覆盖了dismiss func:

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    super.dismiss(animated: true, completion: nil)
}

UIAlertController使用完成块传递数据,当你传递nil时,动作根本不会调用。

当你覆盖dismiss func时,你需要传递完成参数

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    super.dismiss(animated: true, completion: completion)
}
希望我能帮忙

答案 2 :(得分:0)

您可以检查这是否有效

    alert.addAction(UIAlertAction(title: "cancel", style: UIAlertActionStyle.Cancel, handler: { action in
        switch action.style{
        case .Default:
            println("default")

        case .Cancel:
            println("cancel")

        case .Destructive:
            println("destructive")
        }
    }))

答案 3 :(得分:0)

这个问题相当陈旧,但我今天遇到了同样的麻烦。

关键是你正在使用iPad,所以你必须在popover

中展示它
if UIDevice.current.userInterfaceIdiom == .pad{
  alert.modalPresentationStyle = .popover
  let pp = ac.popoverPresentationController
  pp?.sourceView = sender as? UIView // or pp?.sourceRect = <some rect...>
  present(alert, animated: true, completion: {})
}else{
  present(alert, animated: true, completion: {})
}

注意:它是swift3