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

时间:2009-01-14 12:13:48

标签: cocoa cocoa-bindings key-value-coding

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

如何将NSTokenField值绑定设为NSString

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

4 个答案:

答案 0 :(得分:4)

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

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index

(此方法实际上是在NSControl中声明的,NSTextField的超类。)

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

似乎Cocoa Bindings Reference表示绑定到NSTokenField值的对象应该是字符串或数字,但根据我的经验,这是不正确的,并且令牌字段应绑定到NSArray ,就像使用setObjectValue时一样:

答案 1 :(得分:2)

您可以继承自己的NSValueTransformer并在绑定中设置它。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

执行此操作的最佳方法(如Cocoafan指出)是使用Value Transformers。值变换器允许您将使用模型的对象类型转换为适合视图的类型。这是一个非常简单的String / Array转换器,它允许您将数据存储为逗号分隔的字符串,但会将其来回转换为字符串数组。

@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,然后在右侧的Bindings Inspector中选择Value绑定,设置" Value Transformer"根据以下内容StringArrayTransformer

Setting the Value Transformer Binding for NSTokenField