将NSComboBox绑定到枚举类型?

3
我有一个非常简单的问题,但解决方案却很难找到。
以下是我所拥有的内容:
typedef { foo, bar, baz} EnumType;

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

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

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

我还尝试使用NSValueTransformer将枚举值转换为NSStrings,反之亦然,但是我无论如何都无法使其工作:大多数尝试都会导致抛出异常。

这个微不足道的任务已经耗费了我三个小时的时间。救命啊!谢谢!

3个回答

1

我能想到两种方法来解决你的问题。

  1. 将字符串数组按照枚举中的顺序加载。由于你已经完成了其余的工作,查询“indexOfSelectedItem”将给出枚举的确切值。(注意:仅当你的枚举从零开始时才有效。根据你的示例,我想这是正确的。)

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


谢谢。我认为两种解决方案都可以通过一些调整来正常工作。 - David Stein

0

我认为你可以使用NSValueTransformer来完成这个任务。

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

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

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

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


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"]];

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


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