Как получить текущее название кнопки в Swift 3.0, ios, используя sender.titleForState(.Normal)!

#ios #uibutton #swift3 #title

#iOS #uibutton #swift3 #Название

Вопрос:

Я попытался получить значение title a button в swift, как показано ниже.

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

но это не сработало, даже если оно ничего не выдает hint , когда мы нажимаем . после отправителя.

итак, каков правильный способ сделать это в swift 3.0

Или, если мы создадим IBOutlet , а затем используем его currentTitle , он будет работать нормально, как показано ниже. Почему мы не можем получить его с sender. помощью for выше

 @IBOutlet var thebutton: UIButton!

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

Комментарии:

1. Измените отправителя на UIButton .

Ответ №1:

Потому что параметр sender находится в type Any вместо UIButton . Измените подпись метода на:

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

и вы должны быть готовы к работе.

Комментарии:

1. да, это работает, но вы должны развернуть его, как показано ниже let buttonTitle = sender.title(for: .normal)! . спасибо за помощь.

2. просто чтобы знать, я спрашиваю, почему мы должны проверять, имеет ли заголовок кнопки значение (для nil), мы знаем, что оно имеет значение, поэтому мы можем просто unwrap вместо проверки nil .

3. Да, если вы уверены, что это не nil, тогда используйте ! if let предложение вместо. Я лично избегаю использовать ! как можно больше, поскольку это делает ваш код уязвимым для неожиданных исключений, подобных тем, которые вызваны разворачиванием необязательного значения nil.

4. заранее спасибо 🙂

5. Это работает, но если тем временем вы программно изменили название кнопки, вы получите исходное название, а не текущее название. Чтобы восстановить текущее название, вы должны сделать: пусть 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)
}
 

Комментарии:

1. Здесь я получаю сообщение «Невозможно присвоить неизменяемому выражению типа «Строка @lvalue??»»

Ответ №4:

Для устранения предупреждения может быть использован следующий код.

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

Ответ №5:

Используя Swift версии 5.5.2, я обнаружил, что лучший способ напечатать заголовок метки:

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

Я получал предупреждение при использовании sender.title(for: .normal) . Восклицательный знак (!) решил проблему.

Ответ №6:

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

Так что это для swift 4.0, а не для последнего.

Ответ №7:

Если ваша кнопка имеет обычный заголовок, вы можете использовать:

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
    }
}
 

Ответ №8:

Начиная с Swift 3.0, он изменился с

sender.titleForState(.Normal)! >> sender.title(для : .normal)!

Измените Any на AnyObject.

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

Комментарии:

1. У AnyObject нет метода title(for:) .

Ответ №9:

   @IBAction func btnNextTapped(_ sender: Any) {
    let title = (sender as AnyObject).title(for: .normal)!
  }
 

Swift4.0