Изменение цвета ярлыка в зависимости от текущего цвета ярлыка в устройстве iPhone - PullRequest
0 голосов
/ 03 мая 2010

У меня проблемы с определением кода оператора if для изменения цвета метки пользовательского интерфейса на основе текущего цвета метки. Например, если цвет метки в настоящий момент красный и нажата правильная кнопка, я хочу изменить цвет метки на черный. Если цвет ярлыка черный, я хочу, чтобы цвет ярлыка изменился на синий.

1 Ответ

1 голос
/ 03 мая 2010

Теоретически вы можете использовать условное выражение, например if ([label.backgroundColor isEqual:[UIColor blackColor]) { ... }, но вы должны быть осторожны, потому что два цвета, которые выглядят одинаково, могут не обязательно проходить isEqual:. (например, если один - в градациях серого, а другой - 24-битный RGB).

Выполнение условной логики на основе визуальных атрибутов вашего представления выглядит как проектное решение, которое вы все равно можете пересмотреть. Вы делаете более трудным изменение вашего визуального дизайна в будущем (например, использование разных цветов) без внесения ошибок в логику вашего приложения. Шаблон Model View Controller побуждает нас отделить состояние нашей модели, логику, которая ее изменяет, и представления, которые представляют ее визуально. Когда ваша метка переключается между тремя цветами, цвет, по-видимому, представляет некоторое базовое логическое состояние, которое переключается между тремя возможными значениями. Лучшим вариантом было бы циклически изменять это состояние в вашей базовой модели и позволить цвету метки отражать это состояние.

Например, допустим, цвет вашего ярлыка соответствует выбору оружия в игре «камень, бумага, ножницы»:

// .h
typedef enum WeaponState {
    WeaponStateRock,
    WeaponStateScissors,
    WeaponStatePaper
} WeaponState;

// .m    
- (IBAction)weaponSelectorButtonClicked {
    if (weaponState == WeaponStateRock) {
        weaponState = WeaponStateScissors;
    }
    else if (weaponState == WeaponStateScissors) {
        weaponState = WeaponStatePaper;
    }
    else {
        weaponState = WeaponStateRock;
    }
    [self refreshView];
}

- (void)refreshView {
    if (weaponState == WeaponStateRock) {
        self.label.backgroundColor = [UIColor redColor];
    }
    else if (weaponState == WeaponStateScissors) {
        self.label.backgroundColor = [UIColor blackColor];
    }
    else {
        self.label.backgroundColor = [UIColor blueColor];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...