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

时间:2011-08-22 11:56:17

标签: objective-c xcode cocoa cocoa-bindings

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

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

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

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

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

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

谢谢, Ĵ

3 个答案:

答案 0 :(得分: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;
}

这可以绑定到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;
}

答案 1 :(得分:4)

枚举不是对象。 Cocoa绑定是一种将模型对象连接到视图对象的方法。

答案 2 :(得分:2)

如果您使用的是Interface Builder,则可以通过属性面板为每个NSMenuItem项嵌入枚举表示的整数。然后选择NSPopUpButton并指定绑定'选择的标签'带有关键路径的物业。

在此示例中,假设IB的文件所有者是CSProfile。使用两个NSMenuItem项目准备NSPopUpButton,并使用0(kQualityBest)和1(kQualityWorst)标记它们。然后导航选择的标签' NSPopUpButton并使用模型密钥路径'质量'检查绑定到文件所有者'(CSProfile)。

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