Ios 在Swift 3.0中,如何检查按下的按钮
我知道下面将返回被按下按钮的标题Ios 在Swift 3.0中,如何检查按下的按钮,ios,swift3,uibutton,sender,Ios,Swift3,Uibutton,Sender,我知道下面将返回被按下按钮的标题 let myString = sender.title(for: .normal)! 但我真的很想理解为什么这是可行的。我在苹果里找不到它 我在另一个线程中读到,sender是Any类型的参数,而不是UIButton,但我希望您能帮助我破译此语法。您可以在方法名称中看到sender的类型。您发布的代码仅在发件人是ui按钮时有效,如下所示: @IBAction func sampleMethod(_ sender: UIButton) { let myS
let myString = sender.title(for: .normal)!
但我真的很想理解为什么这是可行的。我在苹果里找不到它
我在另一个线程中读到,
sender
是Any
类型的参数,而不是UIButton,但我希望您能帮助我破译此语法。您可以在方法名称中看到sender
的类型。您发布的代码仅在发件人是ui按钮时有效,如下所示:
@IBAction func sampleMethod(_ sender: UIButton) {
let myString = sender.title(for: .normal)
}
如果sender
类型为Any
,则必须将其作为ui按钮展开,以便以相同的方式访问标题,如下所示:
@IBAction func sampleMethod(_ sender: Any) {
if let sender = sender as? UIButton {
let myString = sender.title(for: .normal)
}
}
如果不这样做,应用程序将无法编译。类型Any
没有title
属性
如果通过从情节提要拖动到代码来创建iAction
函数,则默认情况下,发送者类型为Any
,如下所示:
您可以使用类型旁边的下拉菜单将其设置为ui按钮
,如下所示:
@IBAction func sampleMethod(_ sender: Any) {
if let sender = sender as? UIButton {
let myString = sender.title(for: .normal)
}
}
类的文档中描述了目标操作机制,该类是可操作控件(如ui按钮
)继承自的类
本质上,操作函数必须实现以下签名之一:
doSomething()
doSomething(uu发送方:任意)
doSomething(uu发送方:任意,事件:UIEvent)
sender
参数将是发送操作的控件
Swift中的Any
是一种特殊类型,可以表示任何类型,但它不是实际类型,因此,如果发送方是UIButton
,则sender
将是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)
}
现在,如果您错误地将doSomething
连接到文本字段上的某个操作,则最后两种形式会在向下播放失败时导致运行时崩溃;但希望您在测试过程中发现这一点,因此通常认为这样做是“安全的”
这也会起作用。(如果您不知道发件人的类型)
但按钮最常用的方式是
let string = (sender as! UIButton).title(for: .normal)
print(str!)
通常,此方法由系统调用,按钮的实例作为参数传递。这就是为什么在方法中,您可以获得按钮。编译器不允许您在AnyOnject
上调用title(for:)
。