Можно ли программно обновить заголовок / текст UIButton? - PullRequest
93 голосов
/ 23 июня 2009

У меня есть 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.

Ответы [ 12 ]

110 голосов
/ 19 мая 2011

Я решил проблему, просто установив параметр title для UIControlStateNormal, и он автоматически работает в других состояниях. Кажется, проблема в том, что вы устанавливаете другой UIControlState.

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
51 голосов
/ 23 июня 2009

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


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

13 голосов
/ 15 ноября 2011

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

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

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

11 голосов
/ 27 октября 2011

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

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

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

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

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

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

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

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

10 голосов
/ 05 марта 2015

По состоянию на Swift 4:

    button.setTitle("Click", for: .normal)
7 голосов
/ 21 декабря 2015

для swift:

button.setTitle("Swift", forState: UIControlState.Normal)                   
4 голосов
/ 20 августа 2014

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

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

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];
3 голосов
/ 28 ноября 2012

Еще одна возможная причина заключается в следующем:

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

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

2 голосов
/ 01 марта 2013

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

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];
1 голос
/ 23 ноября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...