【问题标题】:Weird error in accessing the text of UIButton in swift快速访问 UIButton 的文本时出现奇怪的错误
【发布时间】:2014-11-20 09:18:55
【问题描述】:

当我写一个像这样的简单函数时:

@IBAction func buttonTapped(theButton:UIButton) {
        println(theButton.titleLabel.text);
    }

它给了我一个错误:UILabel 没有名为 text 的标签。

但是,当我将其更改为:

@IBAction func buttonTapped(theButton:UIButton) {
        println(theButton.titleLabel?.text);
    }

它工作正常,但它会打印出如下内容:

Optional("1");

我做错了什么?我期望值为 1。但它正在打印出 Optional("1"),其次,它在 println(theButton.titleLabel?.text); 时工作正常;

【问题讨论】:

  • 您期待什么结果?你的 UIButton 的标签是什么? (此外,在报告错误时,复制和粘贴实际的、准确的错误消息文本会有所帮助...)
  • @Paulw11 它给了我 Optional("1")

标签: ios swift uibutton


【解决方案1】:

你可以直接从

let title = theButton.currentTitle!

【讨论】:

    【解决方案2】:

    可选链使结果可选,因此您打印的是可选值:https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/OptionalChaining.html

    使用可选绑定,您只能在值退出时打印该值。

    if let text = theButton.titleLabel?.text {
        println(text)
    } else {
        // text doesn't have value
    }
    

    【讨论】:

      【解决方案3】:

      @Kirsteins 的回答展示了如何以安全的方式获取按钮标签文本。

      记住:

      • UIButton 有一个titleLabel,这是一个可选的UILabel
      • UILabel 有一个 text 属性,这是一个可选的 String

      所以链中有 2 个选项。您可以像@Kirsteins 的回答那样使用可选绑定,或者使用强制展开:

      let text = theButton.titleLabel!.text!
      

      但是我不鼓励使用,因为如果 2 中的任何一个为 nil,您将遇到运行时异常。但为了完整起见,值得一提。

      【讨论】:

        【解决方案4】:

        按钮的titleLabel 属性返回一个可选的UILabel,这意味着按钮可能没有titleLabel。

        var titleLabel: UILabel? { get }
        

        如果不给按钮设置标题,那么按钮就没有titleLabel属性,iOS框架只有在按钮有标题的情况下才会添加titleLabel,我觉得这样会减少内存。

        这就是为什么你必须把“?” (称为可选链接,您可以在此处阅读 http://bit.ly/1vrSOi1),但这通常由 Xcode 本身自动完成。

        【讨论】:

          【解决方案5】:

          Kirsteins 回答正确,但漏掉了一个小细节

          如果您的对象可以为 nil(可选),您需要先检查它是否存在然后访问其值,如下所示:

          if let text = theButton.titleLabel?.text {
              println(text)
          }
          

          但你也可以忽略 if 并像这样调用它:

          let text : String = theButton.titleLabel?.text
          // If theButton.titleLabel don't exists then text will be nil
          

          如果 IBOutlet 是用 ? 声明的,就会发生这种情况,但如果你用 ! 声明,这意味着你知道它可能是 nil,但你永远不希望它是 nil,对于 IBOutlet,我更喜欢这种方法,因为如果IBOutlet 未连接,那么我的代码可能有问题。

          @IBOutlet var theButton : UIButton!
          // and get text value as
          theButton.titleLabel!.text
          

          这将确保 theButton.titleLabel 可以为 nil,但在这部分代码中它是必需的,希望这有助于理解可选 (?) 和可选必需 (!) 之间的区别

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多