我知道以下内容将返回按下的按钮的标题。
let myString = sender.title(for: .normal)!
但我真的很想知道为什么会这样。我在Apple documentation for UIButton中找不到它。
我在另一个帖子中读到sender
是Any
类型的参数,而不是UIButton,但我希望在解释这种语法方面有任何帮助。
答案 0 :(得分:3)
您可以在方法名称中看到sender
的类型。您发布的代码仅在发件人为UIButton
时才有效,如下所示:
@IBAction func sampleMethod(_ sender: UIButton) {
let myString = sender.title(for: .normal)
}
如果sender
的类型为Any
,那么您必须将其打包为UIButton
才能以相同的方式访问标题,如下所示:
@IBAction func sampleMethod(_ sender: Any) {
if let sender = sender as? UIButton {
let myString = sender.title(for: .normal)
}
}
如果你不这样做,应用程序就不会编译。类型Any
没有title
属性。
如果要通过从故事板拖动到代码来创建IBAction
功能,则默认情况下发件人类型为Any
,如下所示:
您可以使用“类型”旁边的下拉菜单将其设置为UIButton
,如下所示:
答案 1 :(得分:1)
UIControl
类的文档中描述了目标 - 操作机制,该类是可操作控件(例如UIButton
)继承自的类。
基本上,action函数必须实现以下签名之一:
doSomething()
doSomething(_ sender: Any)
doSomething(_ sender: Any, event: UIEvent)
sender
参数将是发送操作的控件。
Any
是一种特殊类型,可以表示任何类型,但它不是实际类型,因此如果发件人是UIButton
,那么sender
将是{的实例{1}},但您无法访问其中的任何特定方法或属性,除非您将其转发。你可以这样说:
UIButton
但是,通常您知道如何连接控件和操作处理程序,因此无需有条件地保持低调;你可以使用明确的向下转发:
func doSomething(_ sender: Any) {
if let button = sender as? UIButton {
let myString = button(for: .normal)
}
或者,更简洁:
func doSomething(_ sender: Any) {
let button = sender as! UIButton
let myString = button(for: .normal)
}
现在,如果您错误地将func doSomething(_ sender: UIButton) {
let myString = button(for: .normal)
}
连接到文本字段上的操作,那么最后两个表单会在转发失败时给您一个运行时崩溃;但希望你能在测试过程中发现这一点,因此通常认为它是安全的#34;要做。
答案 2 :(得分:0)
guard let string = ((sender) as AnyObject).title(for: .normal)
else{
return
}
print(string)
这也有效。(如果你不知道发件人的类型)
但按钮的最常见方式是
let string = (sender as! UIButton).title(for: .normal)
print(str!)