在Swift 3.0中,如何检查按下了什么按钮

时间:2017-07-28 22:12:03

标签: ios swift3 uibutton sender

我知道以下内容将返回按下的按钮的标题。

let myString = sender.title(for: .normal)!

但我真的很想知道为什么会这样。我在Apple documentation for UIButton中找不到它。

我在另一个帖子中读到senderAny类型的参数,而不是UIButton,但我希望在解释这种语法方面有任何帮助。

3 个答案:

答案 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,如下所示:

enter image description here

您可以使用“类型”旁边的下拉菜单将其设置为UIButton,如下所示:

enter image description here

答案 1 :(得分:1)

UIControl类的文档中描述了目标 - 操作机制,该类是可操作控件(例如UIButton)继承自的类。

基本上,action函数必须实现以下签​​名之一:

  • doSomething()
  • doSomething(_ sender: Any)
  • doSomething(_ sender: Any, event: UIEvent)

sender参数将是发送操作的控件。

Swift中的

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!)