我有一个非常简单的问题,但解决方案证明是非常难以捉摸的。
这就是我所拥有的:
typedef { foo, bar, baz} EnumType;
@interface SomeObject: NSObject
@property EnumType someEnumValue;
@end
...以及一个带有object_controller和NSComboBox的视图,它应该显示[object_controller selection]实例的someEnumValue的字符串名称。
我意识到我无法直接访问枚举值的名称作为字符串。我已经尝试创建一个NSArray,其中包含枚举值的名称,并将ContentValues属性绑定到它 - 这会使用属性字符串加载组合框,但我找不到任何方法来关联所选实例中的枚举值到组合框中的值。
我也尝试过使用NSValueTransformer将枚举值转换为NSStrings,反之亦然,但对于我的生活,我无法让它工作:大多数这些尝试都会导致抛出异常。
这项琐碎的任务已经让我的生活大约三个小时。救命!谢谢!
答案 0 :(得分:1)
我可以考虑两种方法来解决您的问题。
使用与枚举中的字符串相同的顺序加载数组。因为你已经完成了其他工作,查询NSComboBox的“indexOfSelectedItem”将为你提供enum的确切值。 (注意:仅当你的枚举从零开始时才有效。在我看你的例子时,我猜是这样的。)
由于您已创建一个类来保存枚举值。再添加一个属性,它将保存枚举的名称。再次查询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。