我一直在尝试创建一个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)也在阅读这个答案。我不明白为什么我们需要传入
警报
,这没有意义。我们又不是不知道警报的类型是什么......我们不是已经定义了它的类型吗?!!有人能解释一下传递操作本身在哪里会有用吗,我是说我们能用它做什么?
我知道这是四个问题,但我认为这只是一个基本问题。我在一个我在操场上工作和玩的项目中广泛阅读并使用了闭包/完成处理程序,但我仍然感到困惑。
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")
}
}
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()
}
}
只有当您动态获取代码时,这种切换才有价值,否则对于您知道它的价值的磁贴来说,没有附加值切换。
匿名用户
>
是的,您必须始终处理参数。它是签名的一部分,不能被忽略。它也是特殊的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