3

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

这是我所拥有的:

typedef { foo, bar, baz} EnumType;

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

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

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

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

这个微不足道的任务已经消耗了我大约三个小时的生命。帮助!谢谢!

4

3 回答 3

1

我可以想到两种方法来解决您的问题。

  1. 以与枚举中相同的顺序加载带有字符串的数组。由于您已经完成了查询 NSComboBox 以获取“indexOfSelectedItem”的其余内容,将为您提供枚举的确切值。(注意:仅当您的枚举从零开始时才有效。我想在查看您的示例时就是这种情况。)

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

于 2012-08-13T08:30:38.460 回答
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,并执行一些技巧将枚举值转换为 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"]];

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

于 2012-08-17T15:55:40.917 回答
0

我认为您可以使用NSValueTransformer.

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

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

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

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

于 2013-07-17T05:45:53.857 回答