Подтвердить что ты не робот

Текст заголовка UIButton не обновляется, даже если я обновляю его в главной теме

Я пытаюсь изменить заголовок 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>>
4b9b3361

Ответ 1

Это помогло мне обновить текст заголовка (iOS 7.1, Xcode 5.1):

button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;

Ответ 2

У меня была одна и та же проблема, и я заметил, что везде я устанавливал атрибут Title. Таким образом, любые обновления заголовка не влияли на атрибутированный заголовок.

Мое решение:

[button setAttributedTitle:@"" forState:UIControlStateNormal];

вместо

[button setTitle:@"" forState:UIControlStateNormal];

Ответ 3

В настоящий момент самая короткая работа, с которой я пришел, вызывает:

[button setNeedsLayout];

После обновления заголовка.

Это похоже на iOS 7.1. Все мои кнопки, которые корректно ведут себя в предыдущих версиях iOS (или, возможно, просто скомпилированы с предыдущими SDK), внезапно перестали делать это при компиляции в Xcode 5.1.1 SDK 7.1.

Похоже на ошибку Apple.

Ответ 4

У меня была аналогичная проблема с использованием раскадровки. Используя приведенные выше ответы, мне пришлось использовать

[mybutton setTitle:@"SomeText" forState:UIControlStateNormal];
[button setNeedsLayout];
[button layoutIfNeeded];

И я должен был убедиться, что тип кнопки был "Custom", а не "System" в инспекторе атрибутов.

Ответ 5

Посмотрите, может ли это помочь вам... когда кнопка нажата, проверьте условие, если 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;
    }
}

Ответ 6

В коде есть несколько проблем:

Вы назначаете обратный вызов кнопке:

@selector(userClicked:)

но ваш код находится в другом методе:

-(void)userTapOnTapToRefreshView:(UIButton*)button

Чтобы исправить это, вам нужно реализовать что-то вроде этого:

-(void)userClicked:(id)sender
{
    [(UIButton*)sender setTitle:@"Bye" forState:UIControlStateNormal];
}

И эта часть кода для меня не имеет смысла:

[parentView myButton];

Попробуйте изменить его на:

[parentView addSubview:myButton];

Надеюсь, это поможет:)

Ответ 7

В iOS 7 заголовок UIButton не обновляется, когда он отключен. Это похоже на ошибку в iOS 7.

В качестве обходного пути обновите как нормальный, так и отключенный заголовок. Он работает!

[button setTitle:title forState:UIControlStateNormal];
[button setTitle:title forState:UIControlStateDisabled];

Ответ 8

Это немного поздно и несколько относится к ответу Уолтера Шуртера:

У меня была аналогичная проблема, когда текст кнопки был правильно настроен, пока я не обновился до 7.1. Затем я обнаружил, что, так как моя кнопка была отключена, мне пришлось установить цвет заголовка и текст заголовка для отключенного состояния, чтобы текст отображался. Тогда все работало как шарм!

Ответ 9

В моем случае я пробовал все, но ничего не работало. Затем я просто изменил тип кнопки с системы на обычай из раскадровки. БУМ! все началось нормально.

Ответ 10

Попробуйте следующее:

[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];
}

Ответ 11

Измените тип кнопки на "Пользовательский", вместо "Система", и он будет работать, как ожидалось:)

Ответ 12

Для Swift 3 до 5 просто используйте следующее:

button.setTitle("My title", for: .normal)

или для приписанного текста используйте это:

button.setAttributedTitle(<AttributedString>, for: .normal)

Ответ 13

Ну, все о включенном состоянии UIButton, Apple изменила что-то в 7.1, что не позволяет вам изменять заголовок, если у вас есть UIButton в отключенном состоянии, вот и все.

Спасибо Apple, я потерял 10 мин. отлаживая приложение, которое работает нормально.

Только что узнал сегодня утром, обновил XCode вчера до 5.1.1 и iOS до 7.1

Ответ 14

Это может быть проблема обновления макета кнопки..... Попробуйте использовать...

[button setNeedsLayout];
[button layoutIfNeeded];

Это заставит кнопку обновлять макет.

Ответ 15

Это может быть тривиально, но если вы установите некоторое изображение кнопки (вместо фонового изображения), которое заполняет всю рамку кнопки, это приведет к смещению заголовка вправо и, таким образом, сделает его невидимым. Если это так, попробуйте изменить изображение кнопки на фоновое изображение.

Ответ 16

Наконец, я понял это. Были две проблемы:

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];
    });
}

Спасибо всем, кто ответил/прокомментировал!

Ответ 17

В руководстве 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.

Ответ 18

Нет необходимости использовать:

[button setNeedsLayout];
[button layoutIfNeeded];

Вместо этого сначала установите тип как DEFAULT в CUSTOM

Если вы применили setAttributedTitle, используйте:

[button setAttributedTitle:[NSAttributedString new] forState:UIControlStateNormal];

В противном случае нет необходимости ничего менять.

Если цвет текста не изменился, примените ту же самую вещь и установите цвет заголовка с помощью:

[button setTitleColor:[any_color] forState:UIControlStateNormal];

Ответ 19

Заключение после попытки многих решений заключается в использовании setAttributedTitle вместо setTitle.

Чтобы сделать строку заголовка для AttributedString:

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@" new Test "];

[button setAttributedTitle:attString forState:UIControlStateNormal];

Кстати, эта проблема не всегда случается в нормальном состоянии, но она внезапно происходит главным образом по следующим причинам:

  • Если вы измените включенное состояние UIButton и попробуйте изменить заголовок.

  • Если вы используете присвоенное значение и затем хотите изменить его с помощью setTitle, приписанное значение превосходит название в этом случае.

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

Ответ 20

Я сомневаюсь, что 'button' передан как параметр myButton.Anyway, если myButton является членом var, вы можете просто [myButton setTitle: @ "Bye" forState: UIControlStateNormal];

Ответ 21

Попробуйте объявить кнопку в качестве свойства либо в интерфейсе, либо в части реализации контроллера просмотра/просмотра

@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]];
    ...
}

...

Ответ 22

Ничего из этого не было сделано для моего случая (у меня была кнопка поверх представления, представленного с помощью UIPopoverController), и мне пришлось удалитьFromSuperview перед setTitle, а затем addSubview назад - надеюсь, что это поможет кому-то с подобными проблемами

Ответ 23

вместо yourButton.titleLabel?.text = "T"

использовать это yourButton.setTitle("TITLE", для:.normal)

Ответ 24

Всегда добавляйте addSubview перед установкой текста в UIButton.