Cocoa 如何使NSTokenField的值绑定提供NSString?

Cocoa 如何使NSTokenField的值绑定提供NSString?,cocoa,cocoa-bindings,key-value-coding,Cocoa,Cocoa Bindings,Key Value Coding,我已将NSTextField替换为NSTokenField,以便可以执行一些自动完成。NSTextField的值绑定到控制器类的NSString属性。现在,我已将NSTextField更改为NSTokenField,该值已更改为NSArray 如何使NSTokenField值绑定成为NSString 将值从NSString更改为NSArray似乎是糟糕的OO设计。我认为子类应该能够在不修改子类的情况下替换超类。NSTokenField的值绑定接受NSString或NSNumber绑定,而不是NS

我已将
NSTextField
替换为
NSTokenField
,以便可以执行一些自动完成。
NSTextField
的值绑定到控制器类的
NSString
属性。现在,我已将
NSTextField
更改为
NSTokenField
,该值已更改为
NSArray

如何使
NSTokenField
值绑定成为
NSString


将值从
NSString
更改为
NSArray
似乎是糟糕的OO设计。我认为子类应该能够在不修改子类的情况下替换超类。

NSTokenField的值绑定接受NSString或NSNumber绑定,而不是NSArray。您是如何确定它需要一个NSArray的?

如果您只需要自动完成,而不是标记化,您可以通过使用普通的NSTextField并实现委托方法来实现这一点:

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index
(此方法实际上是在NSTextField的超类NSControl中声明的。)

如果确实希望进行标记化,则必须为要在标记字段中显示的对象值提供NSArray。如中所述,您提供的数组将是字符串和对象的混合体。字符串将按原样显示,任何非字符串对象将在标记字段中显示为标记。您需要实现各种NSTokenField委托方法,以便为数组中每个表示的对象提供一个要显示的字符串

看起来,绑定到NSTokenField值的对象应该是字符串或数字,但根据我的经验,这是不正确的,令牌字段应该绑定到NSArray,就像使用setObjectValue时一样:

您可以对自己的对象进行子类化,并在绑定中进行设置。

最好的方法是这样做(正如Cocoafan指出的)是要使用的。值转换器允许您将模型中使用的对象类型转换为适合视图的类型。下面是一个非常简单的字符串/数组转换器,它允许您将数据存储为逗号分隔的字符串,但将其来回转换为字符串数组

@interface StringArrayTransformer: NSValueTransformer {}
@end

@implementation StringArrayTransformer

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

+ (BOOL)allowsReverseTransformation { return YES; }

- (id)transformedValue:(id)value {
    NSString *string = (NSString*) value;
    return [string componentsSeparatedByString:@", "];
}

-(id)reverseTransformedValue:(id)value {
    NSArray *array = (NSArray*)value;
    return [array componentsJoinedByString:@", "];
}
@end
如果您正在为NSTokenField使用绑定,则要使用此转换器,只需在Interface Builder中选择NSTokenField,然后在右侧的绑定检查器中,为值绑定将“值转换器”设置为
StringArrayTransformer
,如下所示


我认为文档是错误的:。