Можно ли программно обновить заголовок / текст UIButton?
-
06-07-2019 - |
Вопрос
У меня есть 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.
Решение
У вас есть кнопка, указанная как IBOutlet в вашем классе контроллера представления, и правильно ли она подключена как выход в Interface Builder (перетащите ctrl из новой ссылки на выходной файл к владельцу файла и выберите свой объект UIButton)? Обычно это проблема, когда я вижу эти симптомы.
<Ч>Изменить. Хотя это не относится к этому случаю, что-то подобное также может произойти, если для кнопки установить атрибутивный заголовок , тогда вы попытаетесь изменить заголовок, а не приписанный заголовок. р>
Другие советы
Я решил проблему, просто установив параметр title для UIControlStateNormal, и он автоматически работает с другими состояниями. Кажется, проблема в том, что вы устанавливаете другой UIControlState.
[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
Я обнаружил еще одну проблему. Это может быть ошибка, появившаяся в iOS 5, но я подумал, что могу указать на нее всем, кто сталкивается с ней.
Если вы не установите какой-либо текст по умолчанию для кнопки в XIB, текст никогда не появится, если вы установите его программно. И если вы установите текст в XIB, любой текст, который вы впоследствии назначите кнопке программно, будет обрезан до размера текста по умолчанию.
И, наконец, если вы показываете представление с помощью кнопки, а затем вызываете другое представление (например, ActionSheet) и затем отклоняете его, текст, назначенный кнопке программно, будет удален, а заголовок кнопки вернется к все, что вы настроили в XIB.
Несмотря на то, что проблема с кофеином Комы была решена, я хотел бы предложить еще одну потенциальную причину, по которой название не будет отображаться на UIButton. Р>
Если вы установите изображение для кнопки UIB с помощью
- (void)setImage:(UIImage *)image forState:(UIControlState)state
Может охватывать заголовок. Я нашел это нелегким путем и представляю, что некоторые из вас в конечном итоге читают эту страницу по той же причине.
Используйте этот метод вместо
- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state
для изображения кнопки и заголовка не будет затронут.
Я проверил это с помощью программно созданных кнопок и кнопок, созданных в .xib
Начиная со Swift 4:
button.setTitle("Click", for: .normal)
для swift:
button.setTitle("Swift", forState: UIControlState.Normal)
Оказывается, документы скажут вам ответ! UIButton будет игнорировать изменение заголовка, если у него уже есть Attributed String для использования (по-видимому, это значение по умолчанию, которое вы получаете при использовании построителя интерфейса Xcode).
Я использовал следующее:
[self.loginButton
setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil]
forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];
Еще одна возможная причина заключается в следующем:
Если вы попытаетесь установить заголовок кнопки в методе (id) initWithNibName: ...
, то свойство кнопки по-прежнему будет равно нулю. Это еще не было назначено на UIButton. Р>
Вы должны быть уверены, что настраиваете свои кнопки в методе, подобном (void) viewWillLoad
или (void) viewWillAppear
, но вы, вероятно, не хотите установите их как (void) viewDidAppear
.
Иногда это может быть очень сложно. Самый простой способ - обновить " вид кнопки! Р>
//Do stuff to your button here. For example:
[mybutton setEnabled:YES];
//Refresh it to new state.
[mybutton setNeedsDisplay];
У меня продолжали возникать проблемы с этим, единственное решение состояло в том, чтобы добавить изображение и метку в качестве подпредставлений к uibutton. Затем я обнаружил, что основной проблемой было то, что я использовал UIButton с названием: Attributed. Когда я изменил его на Обычный, просто установив titleLabel.text, добился цели!
@funroll абсолютно прав. Здесь вы можете увидеть, что вам нужно Убедитесь, что функция работает только в основном потоке . Если вы не хотите иметь дело с потоками, вы можете сделать это, например, следующим образом: создать NSUserDefaults и в ViewDidLoad условие проверки было нажато на кнопку в другом представлении или нет (в другом наборе представлений в NSUserDefaults необходима информация) и в зависимости от условий задайте необходимый заголовок для ваш UIButton, поэтому [yourButton setTitle: @ " название " forState: UIControlStateNormal];
Убедитесь, что вы в главной теме.
Если нет, он все равно сохранит текст кнопки. Он будет там, когда вы будете проверять объект в отладчике. Но на самом деле это не обновит представление.