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

您应该如何处理UIAlertAction的闭包参数

朱英范
2023-03-14

我一直在尝试创建一个UIAlertAtion,它也有一个处理程序。我阅读了这个问题的答案并知道如何做到这一点。

我的问题只是关于它的结束部分。

1) 我知道我可以写:{println(“Foo”)中的alert}{_ println('Foo')},但我不会写{printlen(“Foo”)}。在这里的注释中解释了这一点,因为您需要处理参数操作。

这是否意味着由于处理程序是(UIAlertAction)类型-

2)我也读了这个,答案基本上是说你可以传入一个函数作为你的参数,但这个函数应该采取UIAlertAction类型的东西 -

private func anything(action : UIAlertAction) {
    print("hello")
}

然后写下了我的警告:

let anotherAction = UIAlertAction(title: "hi", style: UIAlertActionStyle.Default,
 handler: anything(action)) // error: Use of unresolved identifier 'action'

困惑为什么我得到了那个错误

3)在评论中它还说:但是除此之外你不必写UIAlertActionStyle。swift中的默认。。默认也有效

我尝试不使用该样式进行写作,因此将其默认为.违约

let sendLogAction = UIAlertAction(title: "Log") { action in print("goodbye")}

但我得到了以下错误:

'(标题:字符串,(_)-

4)也在阅读这个答案。我不明白为什么我们需要传入警报,这没有意义。我们又不是不知道警报的类型是什么......我们不是已经定义了它的类型吗?!!有人能解释一下传递操作本身在哪里会有用吗,我是说我们能用它做什么?

我知道这是四个问题,但我认为这只是一个基本问题。我在一个我在操场上工作和玩的项目中广泛阅读并使用了闭包/完成处理程序,但我仍然感到困惑。


共有3个答案

狄睿
2023-03-14

1) UIAlerAction init方法定义接受3个参数,最后一个参数是(UIAlertAction)-

alert.addAction(UIAlertAction(title: "test", style: .default, handler: nil))

但是如果您想要指定最后一个参数(非nil),那么您必须提供一个闭包,该闭包将UIAlertAction作为一个参数,并且不返回任何内容(Void)。关于你的链接,他只是使用了他已经为简单起见而创建的“alert”常量。

要回答您的问题“这是否意味着....”,答案是肯定的,因为第三个参数的定义:(UIAlertAction)-

2) 由于传递了参数(操作),因此会出现错误。试着让

anotherAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default,
 handler: anything)

并且您不应该得到错误。

3)UIAlertAction只有(我相信)一个init方法,所以您需要提供所有三个参数来创建它。请参阅我的1)样式答案:. default。这是一种调用Swift枚举的新方法。顺便说一句,所有枚举都必须是小写的,所以. default不是。默认在这里输入代码

alert.addAction(UIAlertAction(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Void))

4)正如您从链接到的答案中看到的那样。您可以使用常量“警报”(UIAlertAction)来做任何您想做的事情,例如检查样式和做一些事情。

func anything(alert: UIAlertAction!) {
    print("somehandler")
    switch alert.title {
    case "OK"?:
      print("title is OK")
    default:
      print("title is not OK")
    }
  }
越运锋
2023-03-14

rmaddy的回答足够了,但作为OP:)我找到了问题的根本原因:

我对参数处理程序缺乏理解,处理程序的类型为:(UIAlertAction)-

处理程序只需要一个函数名称,一旦您提供该函数,它将填充该函数本身的输入。

您只需传递< code > any 作为处理程序ie函数名。

UIAlertAction的内部实现有一些类似于< code>handler(action)的行,它将使用< code > any 类型的< code>(UIAlertAction) -

也就是说,你的< code > any(input:UIAlertAction)应该是做一些有意义的事情。(已经在rmaddy的评论中讨论过)

另一种解决方案是不提供函数,而是在尾随闭包中使用捕获的操作并对其进行任何您喜欢的操作。

let retryAction = UIAlertAction(title: returnTitle(), style: UIAlertActionStyle.Default) { action in
switch action.title {
        case "OK":
        okFunc()
        case "cancel":
        cancelFunc()
        default:
        defaultFunc()
        }
      }

只有当您动态获取代码时,这种切换才有价值,否则对于您知道它的价值的磁贴来说,没有附加值切换。

屠嘉勋
2023-03-14
匿名用户

>

  • 是的,您必须始终处理参数。它是签名的一部分,不能被忽略。它也是特殊的Swift语法,能够删除handler参数,因为它是最后一个参数并且它是一个闭包参数。

    任何内容(操作)更改为任何内容,就像您链接到的示例中一样。

    你误会了。他们并不是说你可以删除样式参数。他们说你可以从UIAlertActionStyle中删除UIAlertActionStyle.Default意味着你只需要通过。默认为样式参数的参数。

    您需要一个示例来说明处理程序的< code>action参数的用处。真的没有太多用处。唯一的属性是标题、样式和是否启用。后者是没有意义的,因为如果处理程序被调用,你就知道它被启用了。唯一可能的用途是,如果标题或样式需要在处理程序中使用,并且在创建时没有硬编码到警报动作中。通过访问处理程序中的title或style属性,可以方便地访问创建动作时使用的实际值。

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

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

    • 下面的示例是一个计时器组件,它有一个按钮(用于启动计时器)和两个标记,显示经过的秒数和经过的秒数乘以2。 但是,它不工作(CodeSandbox演示) 守则 问题 在使用效果调用中,秒值将始终等于上次呈现使用效果块时(当isActive上次更改时)的值。这将导致setDouble秒(秒*2)语句失败。React Hooks ESLint插件给我一个关于这个问题的警告: React Hook use

    • 我有一个UITableView,在委托(视图控制器)中,我已经实现了该函数 然后,我测试编辑样式 作为删除的一部分,我请求用户确认,如果他们选择“是”,与该行相关的项目将被删除,如果他们选择“否”,我将重置编辑样式。 我似乎遇到的问题是没有调用任何完成处理程序。我在其他地方使用过这种格式,没有任何问题。 该警报将显示标题、消息以及按钮“取消”和“是”。如果我点击其中任何一个,什么都不会发生。警报被

    • 问题内容: 我有一种算法,当前会分配很大的双精度数组,它会经常更新和搜索。数组的大小为N ^ 2/2,其中N是算法在其上进行操作的行数。为了与算法周围的应用程序相关联,我还必须保留整个内容的副本。 当然,这对我的算法可以处理的行数施加了限制,因为我要应对堆的限制。到现在为止,我还没有要求使用该算法的人员更新- Xmx设置以分配更多的空间,并且效果很好。但是,我现在遇到了一个真正的问题,我需要此数组

    • 问题内容: 在基于nodejs / express的应用程序中,我需要处理GET请求,其中可能包含使用iso-8859-1字符集编码的变音符号。 不幸的是,它的querystring解析器似乎只能处理纯ASCII和UTF8: 是否有隐藏的选项或其他干净的方法也可以与其他字符集一起使用?默认行为的主要问题是,我没有办法知道是否存在解码错误-毕竟,输入 本来可以 只是简单地解码为仍然看起来像urlen