#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