Ответ 1
Это помогло мне обновить текст заголовка (iOS 7.1, Xcode 5.1):
button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;
Я пытаюсь изменить заголовок UIButton
, который я создал программно, когда пользователь нажимает на него. Итак, это мой код для создания UIButton
:
myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[myButton setBackgroundColor:[UIColor blackColor]];
[myButton setAlpha:0.7];
[myButton setTitle:@"Hello" forState:UIControlStateNormal];
[myButton addTarget:self action:@selector(userClicked:) forControlEvents:UIControlEventTouchUpInside];
[parentView addSubview:myButton];
И, в моем методе userClicked:
, я делаю:
-(void) userClicked:(UIButton*)button
{
NSLog(@"USER CLICKED!!!");
if ([NSThread isMainThread])
{
NSLog(@"is main thread");
}
[button setTitle:@"Bye" forState:UIControlStateHighlighted];
[button setTitle:@"Bye" forState:UIControlStateNormal];
[button setTitle:@"Bye" forState:UIControlStateSelected];
[self someLengthyComputation];
}
Странно то, что я вижу напечатанные сообщения журнала:
USER CLICKED!!!
isMainThread
Но название кнопки не меняется! Что я делаю неправильно?
EDIT: настройка заголовка для нескольких состояний также не работает.
EDIT2: Если я напечатаю описание кнопки в окне отладчика Xcode, он отобразит правильный заголовок!
Printing description of button->_titleView:
<UIButtonLabel: 0xa4c9310; frame = (95 216; 130 22); text = 'Bye'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xa44f080>>
Это помогло мне обновить текст заголовка (iOS 7.1, Xcode 5.1):
button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;
У меня была одна и та же проблема, и я заметил, что везде я устанавливал атрибут Title. Таким образом, любые обновления заголовка не влияли на атрибутированный заголовок.
Мое решение:
[button setAttributedTitle:@"" forState:UIControlStateNormal];
вместо
[button setTitle:@"" forState:UIControlStateNormal];
В настоящий момент самая короткая работа, с которой я пришел, вызывает:
[button setNeedsLayout];
После обновления заголовка.
Это похоже на iOS 7.1. Все мои кнопки, которые корректно ведут себя в предыдущих версиях iOS (или, возможно, просто скомпилированы с предыдущими SDK), внезапно перестали делать это при компиляции в Xcode 5.1.1 SDK 7.1.
Похоже на ошибку Apple.
У меня была аналогичная проблема с использованием раскадровки. Используя приведенные выше ответы, мне пришлось использовать
[mybutton setTitle:@"SomeText" forState:UIControlStateNormal];
[button setNeedsLayout];
[button layoutIfNeeded];
И я должен был убедиться, что тип кнопки был "Custom", а не "System" в инспекторе атрибутов.
Посмотрите, может ли это помочь вам... когда кнопка нажата, проверьте условие, если buttonToggled... как показано ниже, когда у вас есть функция, например changeButtonText
-(IBAction)changeButtonText:(id)sender {
if (!buttonToggled) {
[sender setTitle:@"Initial Text" forState:UIControlStateNormal];
buttonToggled = YES;
} else {
[sender setTitle:@"Alternative Text" forState:UIControlStateNormal];
buttonToggled = NO;
}
}
В коде есть несколько проблем:
Вы назначаете обратный вызов кнопке:
@selector(userClicked:)
но ваш код находится в другом методе:
-(void)userTapOnTapToRefreshView:(UIButton*)button
Чтобы исправить это, вам нужно реализовать что-то вроде этого:
-(void)userClicked:(id)sender
{
[(UIButton*)sender setTitle:@"Bye" forState:UIControlStateNormal];
}
И эта часть кода для меня не имеет смысла:
[parentView myButton];
Попробуйте изменить его на:
[parentView addSubview:myButton];
Надеюсь, это поможет:)
В iOS 7 заголовок UIButton не обновляется, когда он отключен. Это похоже на ошибку в iOS 7.
В качестве обходного пути обновите как нормальный, так и отключенный заголовок. Он работает!
[button setTitle:title forState:UIControlStateNormal];
[button setTitle:title forState:UIControlStateDisabled];
Это немного поздно и несколько относится к ответу Уолтера Шуртера:
У меня была аналогичная проблема, когда текст кнопки был правильно настроен, пока я не обновился до 7.1. Затем я обнаружил, что, так как моя кнопка была отключена, мне пришлось установить цвет заголовка и текст заголовка для отключенного состояния, чтобы текст отображался. Тогда все работало как шарм!
В моем случае я пробовал все, но ничего не работало. Затем я просто изменил тип кнопки с системы на обычай из раскадровки. БУМ! все началось нормально.
Попробуйте следующее:
[button setTitle:@"Bye" forState:UIControlStateHighlighted];
или
[button setTitle:@"Bye" forState:UIControlStateSelected];
Вы также можете изменить свою функцию void:
-(void) userClicked
{
NSLog(@"USER CLICKED!!!");
if ([NSThread isMainThread])
{
NSLog(@"is main thread");
}
[myButton setTitle:@"Bye" forState:UIControlStateNormal];
}
Измените тип кнопки на "Пользовательский", вместо "Система", и он будет работать, как ожидалось:)
Для Swift 3 до 5 просто используйте следующее:
button.setTitle("My title", for: .normal)
или для приписанного текста используйте это:
button.setAttributedTitle(<AttributedString>, for: .normal)
Ну, все о включенном состоянии UIButton, Apple изменила что-то в 7.1, что не позволяет вам изменять заголовок, если у вас есть UIButton в отключенном состоянии, вот и все.
Спасибо Apple, я потерял 10 мин. отлаживая приложение, которое работает нормально.
Только что узнал сегодня утром, обновил XCode вчера до 5.1.1 и iOS до 7.1
Это может быть проблема обновления макета кнопки..... Попробуйте использовать...
[button setNeedsLayout];
[button layoutIfNeeded];
Это заставит кнопку обновлять макет.
Это может быть тривиально, но если вы установите некоторое изображение кнопки (вместо фонового изображения), которое заполняет всю рамку кнопки, это приведет к смещению заголовка вправо и, таким образом, сделает его невидимым. Если это так, попробуйте изменить изображение кнопки на фоновое изображение.
1) button
не находилось в состоянии UIControlStateNormal
.
2) Я вызывал метод, выполняющий длинное вычисление сразу после установки заголовка [self someLengthyComputation]
.
Я решил проблему:
1) Настройка заголовка для всех состояний кнопки.
2) Выполнение этого большого вычисления в другом потоке, а не в основном потоке.
Теперь мой рабочий код:
-(void) userClicked:(UIButton*)button
{
NSLog(@"USER CLICKED!!!");
if ([NSThread isMainThread])
{
NSLog(@"is main thread");
}
[button setTitle:@"Bye" forState:UIControlStateHighlighted];
[button setTitle:@"Bye" forState:UIControlStateNormal];
[button setTitle:@"Bye" forState:UIControlStateSelected];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
[self someLengthyComputation];
});
}
Спасибо всем, кто ответил/прокомментировал!
В руководстве Apple для разработчиков вы не должны указывать текст или цвет метки заголовка кнопки непосредственно как свойство (например, do not сделать это: myButton.titleLabel.text = @ "SomeText" или myButton.titleLabel.textColor = [UIColor blackColor]).
Скорее, вы устанавливаете их с помощью функции настройки UIButton, например:
[myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
... или вот так:
[myButton setTitle:@"SomeText" forState:UIControlStateNormal];.
См. руководство Apple.
Нет необходимости использовать:
[button setNeedsLayout];
[button layoutIfNeeded];
Вместо этого сначала установите тип как DEFAULT в CUSTOM
Если вы применили setAttributedTitle
, используйте:
[button setAttributedTitle:[NSAttributedString new] forState:UIControlStateNormal];
В противном случае нет необходимости ничего менять.
Если цвет текста не изменился, примените ту же самую вещь и установите цвет заголовка с помощью:
[button setTitleColor:[any_color] forState:UIControlStateNormal];
Заключение после попытки многих решений заключается в использовании setAttributedTitle вместо setTitle.
Чтобы сделать строку заголовка для AttributedString:
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@" new Test "];
[button setAttributedTitle:attString forState:UIControlStateNormal];
Кстати, эта проблема не всегда случается в нормальном состоянии, но она внезапно происходит главным образом по следующим причинам:
Если вы измените включенное состояние UIButton
и попробуйте изменить заголовок.
Если вы используете присвоенное значение и затем хотите изменить его с помощью setTitle, приписанное значение превосходит название в этом случае.
Если вы перейдете к другому контроллеру представления, а затем вернитесь назад, чтобы обновить заголовок кнопки.
Я сомневаюсь, что 'button' передан как параметр myButton.Anyway, если myButton является членом var, вы можете просто [myButton setTitle: @ "Bye" forState: UIControlStateNormal];
Попробуйте объявить кнопку в качестве свойства либо в интерфейсе, либо в части реализации контроллера просмотра/просмотра
@property(nonatomic,strong) UIButton* myButton;
затем создайте его
self.myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[_myButton setBackgroundColor:[UIColor blackColor]];
...
Он должен работать. Не спрашивайте меня, почему на самом деле - я просто думаю об этом с ARC/Modern memory management.
EDIT:
Он также должен работать, если вы сохраняете ссылку на кнопку в своей реализации.
@implementation myViewController
{
UIButton* myButton;
}
-(void)createButton
{
myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[myButton setBackgroundColor:[UIColor blackColor]];
...
}
...
Ничего из этого не было сделано для моего случая (у меня была кнопка поверх представления, представленного с помощью UIPopoverController), и мне пришлось удалитьFromSuperview перед setTitle, а затем addSubview назад - надеюсь, что это поможет кому-то с подобными проблемами
вместо yourButton.titleLabel?.text = "T"
использовать это yourButton.setTitle("TITLE", для:.normal)
Всегда добавляйте addSubview перед установкой текста в UIButton.