我正在开发一个项目,该项目非常适合UI的Cocoa绑定,但是我遇到了绑定对象属性值的问题,无法找到合适的解决方案。对象如下:
typedef enum tagCSQuality {
kQualityBest = 0,
kQualityWorst = 1
} CSQuality;
@interface CSProfile : NSObject {
NSString *identifier;
NSString *name;
CSQuality quality;
}
在XIB中,我有一个对象控制器,其内容对象绑定到窗口控制器的“currentSelection”属性,该属性是上述对象的一个实例。然后我绑定了所有按预期工作的名称和标识符,但我看不出如何绑定枚举。
理想情况下,我希望NSPopupButton显示“Best”和“Worst”并选择正确的枚举值。我已经更新了枚举以获得明确的数值,我相信我需要一个值转换器来转换值,但我仍然坚持如何实现它。
任何人都可以帮助我或指出我正确的方向吗?
谢谢, Ĵ
答案 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;