如何获取 Swift 3.0 中按钮的当前标题,ios 使用 sender.titleForState(.Normal)!

Posted

技术标签:

【中文标题】如何获取 Swift 3.0 中按钮的当前标题,ios 使用 sender.titleForState(.Normal)!【英文标题】:How to get the current Title of a button in Swift 3.0 , ios using 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 【参考方案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

【讨论】:

以上是关于如何获取 Swift 3.0 中按钮的当前标题,ios 使用 sender.titleForState(.Normal)!的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 TableView 单元格按钮

iOS / Swift 3.0:如何确定 UITableView 中当前可见的行?

如何在swift 3.0中计算用户从当前位置行进的距离

如何在 Phonegap 3.0 的 InnApp 浏览器中获取当前 url

Swift 3.0,Firebase:如何获取最后添加的记录

如何使用 Alamofire 在 Xcode 8 Swift 3.0 中获取特定的 JSON?