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

8

我正在处理一个项目,理想情况下应该适用于Cocoa绑定的UI,但我遇到了一个问题,无法绑定对象属性的值,并且找不到合适的解决方案。该对象如下:

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

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

在XIB文件中,我有一个对象控制器,其内容对象绑定到一个窗口控制器的“currentSelection”属性上,该窗口控制器是上述对象的实例。我已经绑定了名称和标识符,它们都按预期工作,但我不知道如何绑定枚举。
理想情况下,我希望使用NSPopupButton显示“Best”和“Worst”,并选择正确的枚举值。我更新了枚举,以具有显式数值,我认为我需要一个值转换器来转换这些值,但我无法确定如何实现。
有人能帮我或指点一下方向吗?
谢谢, J

一定有更简单的方法来完成所有这些操作。我一直在寻找一个包装类,可以轻松地包装、解包、计数和绑定typedef枚举等,而不需要过多的脑力劳动。到目前为止还没有找到。 - Alex Gray
3个回答

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;
}

谢谢!这正是我在寻找的。示例也很棒。 - JWood

4

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


谢谢,我明白了。我的问题是如何通过绑定来更新枚举值?我相信可以通过转换器和 NSNumber 对象以某种方式实现。我猜显而易见的方法是有一个 NSNumber* 的单独属性,并在 get/set 选择器中更新,但我只是想知道是否有一种“正确”的方法来做到这一点。 - JWood

2
如果您正在使用Interface Builder,可以通过属性面板为每个NSMenuItem项嵌入枚举表示的整数。然后选择NSPopUpButton并将绑定“selected tag”到具有关键路径属性的属性。
在此示例中,假设IB的文件所有者是CSProfile。准备带有两个NSMenuItem项的NSPopUpButton,并将它们标记为0(kQualityBest)和1(kQualityWorst)。然后导航到NSPopUpButton的“selected tag”,并检查将其绑定到“File's owner”(CSProfile)与Model Key Path 'quality'。
@interface CSProfile : NSObject {
   NSString *identifier;
   NSString *name;
   CSQuality quality;
}
@property (assign) CSQuality quality;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接