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

StackOverflow https://stackoverflow.com/questions/1033763

Вопрос

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

Убедитесь, что вы в главной теме.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top