【问题标题】:Binding NSComboBox to enum?将 NSComboBox 绑定到枚举?
【发布时间】:2013-07-17 13:45:53
【问题描述】:

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

这是我所拥有的:

typedef { foo, bar, baz} EnumType;

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

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

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

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

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

【问题讨论】:

    标签: cocoa enums cocoa-bindings nscombobox


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我认为这两种解决方案都可以通过一些调整来正常工作。
    【解决方案2】:

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

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

    当然,问题在于组合框希望绑定到对象数组(即 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"]];
    

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-21
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多