Изменение цвета метки на основе текущего цвета метки в iPhone dev

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


person Matt Thomas    schedule 03.05.2010    source источник


Ответы (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];
    }
}
person cduhn    schedule 03.05.2010