Изменение текста UIButton


102

Поэтому я пытаюсь обновить текст в UIButton, когда нажимаю на него. Я использую следующую строку для изменения текста:

calibrationButton.titleLabel.text = @"Calibration";

Я убедился, что текст меняется, но когда я запускаю приложение и нажимаю кнопку, он меняется на «Калибровка» на долю секунды, а затем возвращается к своему значению по умолчанию. Есть идеи, почему это может происходить? Есть ли какая-то функция обновления, которую мне нужно вызвать?


Ответы:


248

При компоновке своих подвидов UIButton устанавливает текстовое значение titleLabel, используя свои собственные значения заголовка, так что вы можете установить до четырех разных строк для четырех состояний (нормальный, выделенный, выбранный, отключенный).

Из-за этой функции установка текста titleLabel напрямую не будет сохраняться и будет сброшена кнопкой при размещении своих подвидов.

Это то, что вам нужно сделать, чтобы изменить текст заголовка для состояния кнопки.

[calibrationButton setTitle:@"Calibration" forState:UIControlStateNormal];

4
так что же тогда button.titleLabel.text = @ "some text" должен делать?
Борис Гафуров

4
@BorisGafurov Если вы введете текст button.titleLabel, вы увидите, что titleLabel является свойством только для чтения, и поэтому любое свойство свойства, доступного только для чтения, также доступно только для чтения. Использование точечной нотации для их редактирования не сработает, поэтому вам нужны явные методы для их редактирования. По крайней мере, для меня это имеет смысл.
erdekhayser

1
Думаю, я потратил около двух часов, пока не осознал это (что, к сожалению, я уже знал!)
race_carr

Спасибо за Ваш ответ.
dinesharjani

3
@erdekhayser На самом деле свойства только для чтения МОГУТ иметь свойства чтения / записи. Я использую тег titlelabel для передачи целого числа методу действия. Также см. Ссылку на документы AppleAlthough this property is read-only, its own properties are read/write. Use these properties primarily to configure the text of the button. For example:
Аарон,


6

программно вы можете установить заголовок кнопки, как показано ниже:

[myButton setTitle:@"buttonTitle" forState:UIControlStateNormal];

вы также можете установить свойство заголовка кнопки из раскадровки.


2

Ничего особенного и, возможно, очевидно, но для кнопок доступно несколько состояний. Если вы укажете «неправильный» текст, вы не увидите желаемого изменения текста.

Я заметил, что моя кнопка не показывает текст, который я добавил, используя методы, показанные здесь. Проверьте эту ссылку, чтобы убедиться, что вы предоставляете UIControlState, который хотите.

В чем разница между UIControlStateHighlighted и UIControlStateSelected?


1

Для Swift 3.0

let button = UIButton(type: .system)
button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
button.setTitle("set here", for: .normal)
button.addTarget(self, action: #selector(TableViewController.actionButtonTocuh), for: .touchUpInside)
button.titleLabel?.textColor  = #colorLiteral(red: 0.1019607857, green: 0.2784313858, blue: 0.400000006, alpha: 1)
view.addSubview(button)

1

Для Swift 2.0:

let btnObject : UIButton  = UIButton() 
btnObject.frame = CGRect(x: 8, y: 89, width: 70, height: 22)
btnObject.setTitle("Button Title", forState: UIControlState.Normal)
btnObject.titleLabel?.font = UIFont(name: "Helvetica Neue", size: 13)
btnObject.titleLabel?.textColor = UIColor.whiteColor()
btnObject.backgroundColor = UIColor(red: 189/255, green: 176/255, blue: 0/255, alpha: 1)
btnObject.titleLabel?.textAlignment = NSTextAlignment.Center
btnObject.addTarget(self, action: "btnbtnObjectClick:", forControlEvents: UIControlEvents.TouchUpInside)
subView.addSubview(btnObject)

1

Если вы не хотите устанавливать заголовок для всех состояний, просто установите его для нормального состояния, поскольку заголовок для неустановленных состояний по умолчанию будет соответствовать заголовку нормального состояния.

btn.setTitle("Some text", for:.normal)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.