【问题标题】:In Swift 3.0, how to check what button was pressed在 Swift 3.0 中,如何检查按下了什么按钮
【发布时间】:2018-01-05 02:10:08
【问题描述】:

我了解以下内容将返回被按下按钮的标题。

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

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

我在另一个线程中读到 senderAny 类型的参数而不是 UIButton,但我希望能在破译此语法方面提供任何帮助。

【问题讨论】:

  • 通常这个方法被系统调用,按钮的实例作为参数传递。这就是为什么在方法中,你可以得到按钮。

标签: ios swift3 uibutton sender


【解决方案1】:

你可以在方法名中看到sender的类型。您发布的代码只有在发件人是UIButton 时才有效,如下所示:

@IBAction func sampleMethod(_ sender: UIButton) {
    let myString = sender.title(for: .normal)
}

如果senderAny 类型,那么您必须将其解包为UIButton 才能以相同的方式访问标题,如下所示:

@IBAction func sampleMethod(_ sender: Any) {
    if let sender = sender as? UIButton {
        let myString = sender.title(for: .normal)
    }
}

如果您不这样做,应用程序将无法编译。类型 Any 没有 title 属性。

如果您通过从故事板拖动到代码来创建IBAction 函数,则默认设置是发送者类型为Any,如您在此处看到的:

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

【讨论】:

    【解决方案2】:
     guard let string = ((sender) as AnyObject).title(for: .normal)
        else{
            return
        }
        print(string)
    

    这也可以。(如果您不知道发件人的类型)

    但按钮最常见的方式是

    let string = (sender as! UIButton).title(for: .normal)
    print(str!)
    

    【讨论】:

    • 编译器不会让你在AnyOnject上调用title(for:)
    【解决方案3】:

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

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

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

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

    Any 在 Swift 中是一种特殊类型,可以表示任何类型但它不是实际类型,所以如果发送者是 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 连接到文本字段上的操作,则最后两种形式会在向下转换失败时导致运行时崩溃;但希望您在测试期间发现这一点,因此通常认为这样做是“安全的”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多