当前位置: 首页 > 知识库问答 >
问题:

未调用UIAlertAction处理程序

翁宜年
2023-03-14

我有一个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语句没有控制台输出,并且肯定没有其他事情发生。我的删除代码不会为“是”执行,编辑重置不会为“取消”调用。

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

这是在一个视图控制器中,该视图控制器是从另一个视图控制器(如果有任何方位)以模态方式呈现的。我没有收到任何关于任何其他演示的错误(因此如果self.presentedViewController == nil块)。

我显然在哪里出了问题,但目前我只是看不到哪里。有什么想法吗?

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

共有3个答案

司易安
2023-03-14

你可以检查这是否有效

    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")
        }
    }))
云煌
2023-03-14

检查您的< code>ViewController是导航的< code>childViewController。如果导航覆盖:

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

您必须确保调用超级解雇ViewControlllerAnimated:标志完成:完成

并确保参数< code>completion不能通过< code>nil。< code>UIAlertController将调用这个方法(我也搞混了)。我注销调用者是< code > UIAlertController _ dismissinganimated:triggering action:triggeredByPopoverDimmingView:(又糊涂了)。

它对我有用。我希望它对你的朋友也有用。

祁建业
2023-03-14

我遇到了同样的问题,我发现我覆盖了解雇功能:

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

UIAlertController正在使用完成块传递数据,当您传递nil时,该操作根本不会调用。

当您覆盖消除函数时,您需要传递完成参数

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

希望我能帮上忙

 类似资料:
  • 问题内容: 我向用户展示了一个,但我不知道如何编写处理程序。这是我的尝试: 我在Xcode中遇到很多问题。 该文件说 目前,整个块/封盖都让我有些头疼。任何建议都非常感谢。 问题答案: 而不是将自己放在处理程序中,而应放置(提示:UIAlertAction!)。这应该使您的代码看起来像这样 这是在Swift中定义处理程序的正确方法。 正如Brian在下面指出的那样,还有更简单的方法来定义这些处理程

  • 我正在向用户呈现一个< code>UIAlertView,但我不知道如何编写处理程序。这是我的尝试: 我在Xcode中遇到了很多问题。 文档说

  • 我试图使用一个简单的服务器-客户端应用程序(代码见下文)进入Netty。 我在与两个问题作斗争: null KJ 这就是服务器的创建方式: 其中一个处理程序类(FeedbackServerHandler执行完全相同的操作,但解析为整数):

  • 我只想确认UIAlertAction的处理程序是一个非转义lambda函数? 我做了ctrl右键单击并查找了UIAlertAction定义,默认情况下它看起来不像转义。这意味着我应该做 在所有UIAlertAction完成块中使用wself而不是self? 在UIKit下 其中处理程序未显示@escaping

  • 如何在Swift中获取的处理程序。它是在初始化时设置的,但是我没有找到任何属性来保持动作的闭包。闭包是

  • 我正在尝试将我的UIAlertViews更改为UIAlertController。我为它设置了这个操作: 但是,处理程序直到动作被点击大约一秒钟后才运行。有什么方法可以加快速度吗?