Привязки Objective C - Привязка перечисления к NSPopupButton - PullRequest
8 голосов
/ 22 августа 2011

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

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

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

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

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

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

Спасибо, J * +1010 *

Ответы [ 3 ]

8 голосов
/ 21 сентября 2011

Вы можете использовать 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;
}
4 голосов
/ 22 августа 2011

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

2 голосов
/ 06 ноября 2011

Если вы используете 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;
...