Objective - C bindings-привязка перечисления к кнопке NSPopupButton

Я работаю над проектом, который идеально подходит для Привязок Cocoa для пользовательского интерфейса, но у меня есть проблема, связывающая значение свойства объекта, и я не могу найти подходящее решение. Объект выглядит следующим образом:

typedef enum tagCSQuality {
    kQualityBest            = 0,
    kQualityWorst           = 1
} CSQuality;

@interface CSProfile : NSObject {
   NSString *identifier;
   NSString *name;
   CSQuality quality;
}

в XIB у меня есть контроллер объекта, объект содержимого которого привязан к свойству "currentSelection" контроллера окна, который является экземпляром вышеуказанного объекта. Затем я связал имя и идентификатор, которые все работают, как ожидалось, но я не вижу как я могу связать перечисления.

В идеале я хотел бы, чтобы NSPopupButton отображал "лучшее" и "худшее" и выбирал правильное значение перечисления. Я обновил перечисление, чтобы иметь явное числовое значение, и я считаю, что мне нужен преобразователь значений для преобразования значений, но я застрял на том, как это может быть реализовано.

может кто-нибудь помочь мне или мне точку в правильном направлении?

спасибо, Джей

3 ответов


можно использовать NSValueTransformerдля этого.

поскольку значения перечисления являются целыми числами, они инкапсулируются в NSNumber "объект".

правильный трансформатор может выглядеть следующим образом.

+(Class)transformedValueClass {
    return [NSString class];
}

-(id)transformedValue:(id)value {
    CSQuality quality = [value intValue];
    if (quality == kQualityBest)
        return @"Best";
    else if (quality == kQualityWorst)
        return @"Worst";

    return nil;
}

это может быть связано с выбранным значением привязки NSPopupButton.

если вы хотите создать двунаправленную привязку (т. е. иметь возможность выбрать что-то в NSPopupButton вы должны добавить следующий код на обратной трансформация:

+(BOOL)allowsReverseTransformation {
    return YES;
}

-(id)reverseTransformedValue:(id)value {
    if ([@"Worst" isEqualToString:value]) 
        return [NSNumber numberWithInt: kQualityWorst];
    else if ([@"Best" isEqualToString:value]) 
        return [NSNumber numberWithInt: kQualityBest];

    return nil;
}

enum является не объект. Привязки Cocoa-это способ подключения объектов модели для просмотра объектов.


Если вы используете Interface Builder, вы можете встроить перечисление, представленное целым числом для каждого элемента NSMenuItem через панель свойств. Затем выберите NSPopUpButton и укажите привязку "выбранный тег"к свойству с ключевым путем.

в этом примере Предположим, что владельцем файла IB является CSProfile. Подготовьте NSPopUpButton с двумя элементами NSMenuItem и пометьте их 0(kQualityBest) и 1 (kQualityWorst). Затем перейдите по "выбранному тегу" NSPopUpButton и проверьте привязку к "владельцу файла" (CSProfile) с модельным ключевым путем "качество".

@interface CSProfile : NSObject {
   NSString *identifier;
   NSString *name;
   CSQuality quality;
}
@property (assign) CSQuality quality;