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;