有时当我使用Swift中的选择器(即Selector
类型)时,我为action
或targetForAction(_:withSender:)
等方法提供addTarget(_:action:)
参数的字符串文字}没有调用或映射到我期望的实际Swift函数。
例如,当如下所示的MyResponder
实例位于响应者链中时,使用字符串targetForAction(_:withSender)
调用showImage:
时无法找到它。知道什么是为不同类型的Swift函数签名提供的正确字符串文字以及必需和/或省略参数标签的选项的模式是什么?
import UIKit
class MyResponder: UIResponder {
func showImage( named filename: String ) {
print( "Loading image..." )
}
}
class MyViewController: UIViewController {
@IBAction func buttonTapped( sender: AnyObject? ) {
if let responder = self.targetForAction( "showImage:", withSender: self ) as? MyResponder {
responder.showImage(named: "my_image" )
}
}
}
答案 0 :(得分:1)
通过评论者的一些试验,错误和鼓励,我设法找出了模式!
字符串文字必须遵循从Swift函数的签名中翻译出来的Objective-C语法,这是一个有趣的小窍门,一开始并不明显,但是当你考虑像{的目的这样的事情时,这是很有意义的。 {1}}属性。在编写更好的代码示例时,我似乎已经找到了映射的模式。
@objc
+(functionName
+ With
)+ First
+(:
)+ second
等。
只有在需要参数标签(即未省略)时,才需要括号中的内容。请记住将:
和With
大写。
在以下每个示例中,First
将自身返回为提供的选择器的目标,指示作为myObject
提供的字符串文字实际上映射了它的Swift函数打算。
Selector