Установить заголовок UIButton с помощью одного вызова метода? - PullRequest
3 голосов
/ 19 марта 2010

Я бы хотел установить заголовок кнопки UIB с помощью кода. Мне нужно вызвать - [UIButton setTitle: forState:] для UIControlStateNormal, UIControlStateHighlighted, UIControlStateDisabled, UIControlStateSelected И это даже не учитывает все комбинации этих состояний вместе.

Само собой разумеется, это утомительно. Можно ли сделать единственный вызов, который установит одну строку в качестве заголовка для всех состояний? (Поскольку я предполагаю, что в 95% случаев это желаемое поведение?)

Ответы [ 4 ]

9 голосов
/ 19 марта 2010

Да, конечно. Из документов :

В общем, если недвижимость не указано для состояния, по умолчанию использовать значение UIControlStateNormal. Если значение для UIControlStateNormal не установлено, то свойство по умолчанию к системному значению. Поэтому на минимум, вы должны установить значение для нормальное состояние.

Так что просто установите заголовок для UIControlStateNormal и вы золотой.

7 голосов
/ 19 марта 2010

Как мистер / мисс. Лягушка говорит, что установка заголовка для UIControlStateNormal обычно делает свое дело. Единственное исключение - если заголовки уже установлены для других состояний. UIControlState - это маска, поэтому вы можете прикрыть задницу следующим образом:

[button setTitle:@"Title" forState:UIControlStateNormal|UIControlStateHighlighted| UIControlStateDisabled|UIControlStateSelected]

Если вы хотите быть кратким:

#define kAllControlStates (UIControlStateNormal|UIControlStateHighlighted| UIControlStateDisabled|UIControlStateSelected)
[button setTitle:@"Title" forState:kAllControlStates];

Или краткий и непрозрачный:

[button setTitle:@"Title" forState:0xffff];

Обновление : Я должен был проверить это, прежде чем ответить. Оказывается, маска типа UIControlStateHighlighted|UIControlStateDisabled указывает состояние, когда оба элемента управления выделены и отключены. Я неправильно предположил, что эта маска означает «выделено или отключено». В заключение, вам лучше ответить мистером Фрогом.

0 голосов
/ 14 ноября 2012

Хотя возврат к значениям для состояния UIControlStateNormal, вероятно, достаточно хорош в 99% случаев, я нашел решение этой проблемы для варианта использования 1%. (У меня есть определенные в приложении состояния в подклассе, что означает, что возврат к нормальному состоянию будет неправильным.)

Я выкладываю его здесь для полноты, хотя ответ уже принят. По сути, он устанавливает атрибут для состояния плюс каждую комбинацию отдельных дополнительных состояний, которые вы укажете.

@interface UIButton (AdditionalStates)
- (void)setTitle:(NSString *)title forState:(UIControlState)state additionalStates:(UIControlState)additionalStates;
@end

@implementation UIButton (AdditionalStates)

- (void)setTitle:(NSString *)title forState:(UIControlState)state additionalStates:(UIControlState)additionalStates
{
    [self setValue:title forKey:@"title" state:state additionalStates:additionalStates mask:(1 << 0)];
}

- (void)setValue:(id)value forKey:(NSString *)key state:(UIControlState)state additionalStates:(UIControlState)additionalStates mask:(NSUInteger)mask(UIControlState)additionalStates
{
    if (additionalStates == 0) {
        [self setValue:value forKey:key state:state];
        return;
    }

    // Iterate over each 'on' bit in additionalStates, starting from the mask bit
    while (mask > 0) {
        if (additionalStates & mask) {
            // Delete the current bit from additionalStates
            NSUInteger reducedAdditionalStates = (additionalStates ^ mask);

            // Set the title for combinations of the remaining additional states with and without the mask bit
            [self setValue:value forKey:key state:(state | (additionalStates & mask)) additionalStates:reducedAdditionalStates mask:(mask << 1)];
            [self setValue:value forKey:key state:state additionalStates:reducedAdditionalStates mask:(mask << 1)];
        }
        mask = (mask << 1);
    }
}

- (void)setValue:(id)value forKey:(NSString *)key state:(UIControlState)state
{
    if ([key isEqualToString:@"title"]) {
        [self setTitle:value forState:state];
        return;
    }
}

@end
0 голосов
/ 24 мая 2012

Создать метод категории для UIButton, который устанавливает его для всех состояний одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...