【问题标题】:How to get the current Title of a button in Swift 3.0 , ios using sender.titleForState(.Normal)!如何获取 Swift 3.0 中按钮的当前标题,ios 使用 sender.titleForState(.Normal)!
【发布时间】:2016-10-16 18:16:23
【问题描述】:

我试图像下面这样快速获取buttontitle

@IBAction func buttonAction(_ sender: Any) {
  let buttonTitle = sender.titleForState(.Normal)!
}

但它不起作用,即使当我们在发件人之后按.时它也没有给出任何hint

那么在 swift 3.0 中这样做的正确方法是什么

或者,如果我们创建一个IBOutlet,然后我们使用它的currentTitle,它就可以正常工作,如下所示。为什么我们不能用sender. 得到它

@IBOutlet var thebutton: UIButton!

@IBAction func buttonAction(_ sender: Any) {
  let buttonTitle = thebutton.currentTitle!
  print(buttonTitle)
}

【问题讨论】:

  • 将发件人更改为UIButton

标签: ios uibutton swift3 title


【解决方案1】:

因为参数 sender 的类型是 Any 而不是 UIButton。将方法签名更改为:

@IBAction func buttonAction(_ sender: UIButton) {
  if let buttonTitle = sender.title(for: .normal) {
    print(buttonTitle)
  }
}

你应该很高兴。

【讨论】:

  • 是的,这行得通,但你必须像下面let buttonTitle = sender.title(for: .normal)! 一样打开它。谢谢你的帮助。
  • 只是想知道我在问,为什么我们要检查按钮标题是否有值(对于 nil),我们知道它有一个值,所以我们可以简单地unwrap 而不是检查@987654326 @.
  • 是的,如果你确定它不为零,那么使用! 而不是if let 子句。我个人尽可能避免使用!,因为它会使您的代码容易受到意外异常的影响,例如解开 nil 可选项引起的异常。
  • 提前感谢 :)
  • 这是有效的,但如果在此期间您以编程方式更改了按钮的标题,您将获得原始标题而不是当前标题。要恢复当前标题,您应该这样做:让 buttonActualTitle = myButton.titleLabel?.text
【解决方案2】:

要在 swift 3.0 中获取按钮的标题,无论其当前状态如何,请尝试使用以下方法:

    @IBAction func buttonPressed(_ sender:UIButton){
       let buttonTitle = sender.titleLabel?.text
       print("\(String(describing: buttonTitle)")
    }

这将根据按钮当前所处的状态返回状态标题。

【讨论】:

    【解决方案3】:

    使用 Swift 5.0 的最智能版本:

    @IBAction func buttonAction(_ sender: UIButton) {
        print(sender.currentTitle)
    }
    

    【讨论】:

    • 这里我得到“无法分配给'@lvalue String??'类型的不可变表达式”
    【解决方案4】:

    为了解决警告,可以使用以下代码。

    @IBAction func buttonAction(_ sender: UIButton) {
          let buttonTitle = sender.title(for: .normal) ?? String()
          print(buttonTitle)
        }
    

    【讨论】:

      【解决方案5】:
      @IBAction func buttonPressed(_ sender: AnyObject) {
        let title = sender.title(for: .normal)
        print("\(title) button pressed")
      }
      

      所以这是 swift 4.0,而不是最后一个。

      【讨论】:

        【解决方案6】:

        如果您的按钮有一个常规标题,您可以使用:

        button.title(for: state) // probably UIControl.State.normal

        如果您的UIButton 具有您需要使用的属性标题:

        self.attributedTitle(for: state)

        或者您可以使用更通用的扩展名:

        extension UIButton {
            func titleForState(_ state: UIControl.State = .normal) -> String? {
                if let title = self.title(for: state) {
                    return title
                }
        
                if let attribTitle = self.attributedTitle(for: state) {
                    return attribTitle.string
                }
        
                return nil
            }
        }
        

        【讨论】:

          【解决方案7】:

          使用 Swift 5.5.2 版,我发现打印标签标题的最佳方法是:

          @IBAction func keyPressed(_ sender: UIButton) {
              print(sender.title(for: .normal)!)
          }
          

          我在使用 sender.title(for: .normal) 时收到警告。感叹号(!)解决了它。

          【讨论】:

            【解决方案8】:

            从 Swift 3.0 开始,它从

            sender.titleForState(.Normal)! >> sender.title(for : .normal)!

            Any 更改为 AnyObject

            @IBAction func buttonPressed(_ sender: AnyObject) {
              let title = sender.title(for: .normal)!
              print("\(title) button pressed")
            }
            

            【讨论】:

            • AnyObject 没有方法title(for:)
            【解决方案9】:
              @IBAction func btnNextTapped(_ sender: Any) {
                let title = (sender as AnyObject).title(for: .normal)!
              }
            

            Swift4.0

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多