Можно ли программно обновить заголовок/текст UIButton?

У меня есть UIButton, который при нажатии вызывает новое представление, в котором пользователь может изменить некоторые настройки. Когда представление отклонено, я хотел бы обновить заголовок/текст UIButton, чтобы отразить новое состояние. Я звоню:

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

Но он никогда не меняется с исходного текста/заголовка, как указано в IB.

Ответ 1

У вас есть кнопка, указанная как IBOutlet в вашем классе контроллера вида, и правильно ли она подключена в качестве выходного устройства в Interface Builder (ctrl перетащить из новой ссылки для доступа к владельцу файла и выбрать свой объект UIButton)? Обычно это проблема, когда я вижу эти симптомы.


Изменить: Хотя это не так, что-то вроде этого также может произойти, если вы установите кнопку приписанный заголовок на кнопку, затем вы попытаетесь изменить заголовок, а не присвоенный заголовок.

Ответ 2

Я решил проблему, просто установив параметр title для UIControlStateNormal, и он автоматически работает с другими состояниями. Проблема заключается в том, что вы устанавливаете другое UIControlState.

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

Ответ 3

Я обнаружил еще одну проблему. Это может быть ошибка, появившаяся в iOS 5, но я подумал, что я укажу ее всем, кто ее встретит.

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

И, наконец, если вы показываете представление своей кнопкой, а затем вызываете другое представление (например, ActionSheet), а затем отклоняете его, текст, который вы назначили кнопке программно, будет удален, а заголовок кнопки вернется к независимо от того, что вы настроили в XIB.

Ответ 4

Несмотря на то, что проблема кофейной комы была решена, я хотел бы предложить еще одну потенциальную причину, по которой название не будет отображаться на UIButton.

Если вы установили изображение для UIButton, используя

- (void)setImage:(UIImage *)image forState:(UIControlState)state

Он может охватывать название. Я нашел это трудным путем и представлю, что некоторые из вас в конечном итоге читают эту страницу по той же причине.

Используйте этот метод вместо

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

для изображения кнопки, и название не будет затронуто.

Я тестировал это с помощью программно созданных кнопок и кнопок, созданных в .xib

Ответ 5

Начиная с Swift 4:

    button.setTitle("Click", for: .normal)

Ответ 6

для быстрого:

button.setTitle("Swift", forState: UIControlState.Normal)                   

Ответ 7

Оказывается, документы дают ответ! UIButton проигнорирует изменение названия, если у него уже есть Attributed String для использования (по-видимому, это значение по умолчанию, которое вы получаете при использовании конструктора интерфейса Xcode).

Я использовал следующее:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];

Ответ 8

Еще одна возможная причина:

Если вы попытаетесь установить заголовок кнопки в методе (id)initWithNibName: ..., тогда свойство кнопки будет по-прежнему равно нулю. Это еще не присвоено UIButton.

Вы должны быть уверены, что вы устанавливаете свои кнопки в методе типа (void)viewWillLoad или (void)viewWillAppear, но вы, вероятно, не хотите устанавливать их еще в (void)viewDidAppear.

Ответ 9

Иногда это может стать очень сложным. Легкий способ - "обновить" вид кнопки!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

Ответ 10

Swift Попробуйте это

button.setTitle("metin", forState: .Normal)  

Ответ 11

У меня были проблемы с этим, единственным решением было добавить изображение и метку в качестве подзаголовков в uibutton. Затем я обнаружил, что основная проблема заключалась в том, что я использовал UIButton с заголовком: Attributed. Когда я изменил его на Plain, просто установив titleLabel.text сделал трюк!

Ответ 12

@funroll абсолютно прав. Здесь вы можете увидеть, что вам понадобится Убедитесь, что функция работает только в основном потоке. Если вы не хотите заниматься нитями, вы можете сделать это следующим образом: создать NSUserDefaults и в режиме cheking в ViewDidLoad нажать кнопку в другом представлении или нет (в другом представлении, установленном в информации NSUserDefaults) и в зависимости от условий, установленных для заголовка для ваш UIButton, поэтому [yourButton setTitle: @ "Title" forState: UIControlStateNormal];

Ответ 13

Убедитесь, что вы находитесь в основном потоке.

Если нет, он все равно сохранит текст кнопки. Он будет там, когда вы проверите объект в отладчике. Но это фактически не обновит представление.