【问题标题】:Objective-C bindings - Binding an enum to an NSPopupButtonObjective-C 绑定 - 将枚举绑定到 NSPopupButton
【发布时间】:2011-11-01 02:29:37
【问题描述】:

我正在开发一个项目,该项目非常适合 UI 的 Cocoa 绑定,但我在绑定对象属性的值时遇到了问题,并且找不到合适的解决方案。对象如下:

typedef enum tagCSQuality {
    kQualityBest            = 0,
    kQualityWorst           = 1
} CSQuality;

@interface CSProfile : NSObject {
   NSString *identifier;
   NSString *name;
   CSQuality quality;
}

在 XIB 中,我有一个对象控制器,其内容对象绑定到窗口控制器的“currentSelection”属性,该属性是上述对象的一个​​实例。然后我绑定了所有按预期工作的名称和标识符,但我看不到如何绑定枚举。

理想情况下,我希望 NSPopupButton 显示“最佳”和“最差”并选择正确的枚举值。我已将枚举更新为具有明确的数值,并且我相信我需要一个值转换器来转换这些值,但我一直坚持到底如何实现这一点。

谁能帮助我或指出正确的方向?

谢谢, J

【问题讨论】:

  • 必须有一种更简单的方法来完成这一切。我一直在寻找一个包装类,它只会包装、解包、计数和绑定typedefenums 等,而不会耗费大量精力。到目前为止没有运气。

标签: objective-c xcode cocoa cocoa-bindings


【解决方案1】:

您可以为此使用NSValueTransformer

由于枚举值只是整数,因此它们被封装在NSNumber 对象中。

一个有效的转换器可能如下所示。

+(Class)transformedValueClass {
    return [NSString class];
}

-(id)transformedValue:(id)value {
    CSQuality quality = [value intValue];
    if (quality == kQualityBest)
        return @"Best";
    else if (quality == kQualityWorst)
        return @"Worst";

    return nil;
}

这可以绑定到NSPopupButton 的选定值绑定。

如果您想创建双向绑定(即能够在NSPopupButton 中选择某些内容,则必须添加以下代码进行反向转换:

+(BOOL)allowsReverseTransformation {
    return YES;
}

-(id)reverseTransformedValue:(id)value {
    if ([@"Worst" isEqualToString:value]) 
        return [NSNumber numberWithInt: kQualityWorst];
    else if ([@"Best" isEqualToString:value]) 
        return [NSNumber numberWithInt: kQualityBest];

    return nil;
}

【讨论】:

  • 谢谢!这正是我想要的。也是很好的例子。
【解决方案2】:

枚举不是对象。 Cocoa 绑定是一种将模型对象连接到视图对象的方法。

【讨论】:

  • 谢谢,我明白了。我的问题是如何通过绑定更新枚举值?我确信它必须以某种方式通过转换器和 NSNumber 对象成为可能。我想显而易见的方法是拥有一个单独的 NSNumber* 属性并在 get/set 选择器中更新,但我只是想知道是否有“正确”的方法来做到这一点。
【解决方案3】:

如果您使用的是 Interface Builder,您可以通过属性面板为每个 NSMenuItem 项嵌入枚举表示的整数。然后选择 NSPopUpButton 并指定将“选定标记”绑定到具有键路径的属性。

在本例中,假设 IB 的文件所有者是 CSProfile。用两个 NSMenuItem 项准备 NSPopUpButton,并用 0(kQualityBest) 和 1(kQualityWorst) 标记它们。然后导航 NSPopUpButton 的 'selected tag' 并检查绑定到 'File's owner'(CSProfile) with Model Key Path 'quality'。

@interface CSProfile : NSObject {
   NSString *identifier;
   NSString *name;
   CSQuality quality;
}
@property (assign) CSQuality quality;

【讨论】:

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