Можно ли программно обновить заголовок/текст 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
Убедитесь, что вы находитесь в основном потоке.
Если нет, он все равно сохранит текст кнопки. Он будет там, когда вы проверите объект в отладчике. Но это фактически не обновит представление.