Objective-C绑定 - 将枚举绑定到NSPopupButton

JWo*_*ood 8 xcode cocoa objective-c cocoa-bindings

我正在开发一个项目,它非常适合UI的Cocoa绑定,但是我遇到了绑定对象属性值的问题,无法找到合适的解决方案.对象如下:

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

@interface CSProfile : NSObject {
   NSString *identifier;
   NSString *name;
   CSQuality quality;
}
Run Code Online (Sandbox Code Playgroud)

在XIB中,我有一个对象控制器,其内容对象绑定到窗口控制器的"currentSelection"属性,该属性是上述对象的一个​​实例.然后我绑定了所有按预期工作的名称和标识符,但我看不出如何绑定枚举.

理想情况下,我希望NSPopupButton显示"Best"和"Worst"并选择正确的枚举值.我更新了枚举以获得明确的数值,我相信我需要一个值转换器来转换值,但我仍然坚持如何实现它.

任何人都可以帮助我或指出我正确的方向吗?

谢谢,J

Seb*_*ian 8

你可以使用一个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;
}
Run Code Online (Sandbox Code Playgroud)

这可以绑定到的Selected Value绑定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;
}
Run Code Online (Sandbox Code Playgroud)