У меня возникли проблемы с определением кода инструкции if для изменения цвета метки пользовательского интерфейса на основе текущего цвета метки. Например, если цвет метки в настоящее время красный и нажата правильная кнопка, я хочу, чтобы цвет метки изменился на черный. Если цвет метки черный, я хочу, чтобы цвет метки изменился на синий.
Изменение цвета метки на основе текущего цвета метки в iPhone dev
Ответы (1)
Теоретически вы можете использовать условное выражение, подобное 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];
}
}