将NSComboBox绑定到枚举?

时间:2012-08-13 03:50:29

标签: cocoa enums cocoa-bindings nscombobox

我有一个非常简单的问题,但解决方案证明是非常难以捉摸的。

这就是我所拥有的:

typedef { foo, bar, baz} EnumType;

@interface SomeObject: NSObject
@property EnumType someEnumValue;
@end

...以及一个带有object_controller和NSComboBox的视图,它应该显示[object_controller selection]实例的someEnumValue的字符串名称。

我意识到我无法直接访问枚举值的名称作为字符串。我已经尝试创建一个NSArray,其中包含枚举值的名称,并将ContentValues属性绑定到它 - 这会使用属性字符串加载组合框,但我找不到任何方法来关联所选实例中的枚举值到组合框中的值。

我也尝试过使用NSValueTransformer将枚举值转换为NSStrings,反之亦然,但对于我的生活,我无法让它工作:大多数这些尝试都会导致抛出异常。

这项琐碎的任务已经让我的生活大约三个小时。救命!谢谢!

3 个答案:

答案 0 :(得分:1)

我可以考虑两种方法来解决您的问题。

  1. 使用与枚举中的字符串相同的顺序加载数组。因为你已经完成了其他工作,查询NSComboBox的“indexOfSelectedItem”将为你提供enum的确切值。 (注意:仅当你的枚举从零开始时才有效。在我看你的例子时,我猜是这样的。)

  2. 由于您已创建一个类来保存枚举值。再添加一个属性,它将保存枚举的名称。再次查询NSComboBox的indexOfSelectedItem。现在,您可以通过从您用来绑定到的arrayController的arrangeObject访问给定索引处的对象,轻松获取关联值。组合框。

答案 1 :(得分:0)

为后代录制我选择的解决方案:

最后,我通过...不使用枚举解决了这个问题。

问题当然是组合框希望绑定到一个对象数组(即NSObject的实例),但是枚举被定义为常量整数(它们是基元)。

我确信可以提供一些基础设施来将枚举值转换为对象,然后再返回。 (表面上看,这就是NSValueTransformer类所做的,并且很容易进行子类化和设计...但是对于我的生活,我找不到任何方法将我的NSValueTransformer子类或它的实例绑定到组合中这个重要步骤的文档并不存在。这很疯狂 - 我发现的每个例子都只是谈论如何对它进行子类化,而不是如何绑定它。我尝试的所有例子都引发了异常。)

最后,我意识到只需将枚举值转换为类的实例,就可以避免所有这些艰苦的工作和翻译。

所以使用枚举,你必须完成所有这些:

typedef { a, b, c } EnumType;
@interface SomeClass {
    @property EnumType enumValue;
}...

// somewhere else, something like this:
NSMutableArray *enumTypeNames = { @"a", @"b", @"c" };

...然后将组合框绑定到enumTypeNames,并执行一些杂技将enum值转换为enumTypeNames索引,反之亦然。

或者,您可以这样做:

@interface EnumClass {
    @property NSString *name;
} ...
@interface SomeClass {
    @property (weak) EnumClass *enumValue;
} ...

// somewhere else:
NSMutableArray *enumValues = [NSMutableArray new];
[enumValues addObject: [EnumClass initWithName: @"a"]];
[enumValues addObject: [EnumClass initWithName: @"b"]];
[enumValues addObject: [EnumClass initWithName: @"c"]];

...并将组合框直接绑定到数组(名称指定为模型键路径)。更清洁的解决方案。

答案 2 :(得分:0)

我认为您可以使用NSValueTransformer完成此操作。

尝试像这样定义你的枚举:

typedef NS_ENUM(NSUInteger, EnumType) {
    foo = 0,
    bar = 1,
    baz = 2
};

然后在您的值转换器中,将输入视为NSNumber并调用-unsignedIntegerValue。如果需要,将其转换为枚举类型,通过switch语句运行它,并返回正确的字符串。

绑定应自动将枚举值包装为NSNumber。