2009-01-14 60 views
2

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

如何使NSTokenField值绑定为NSString

将值从NSString更改为NSArray看起来很糟糕的OO设计。我虽然认为一个子类应该能够替换一个超类而不需要对子类进行任何修改。

回答

1

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

+4

我相信文件是错误的:我的雷达上的问题(http://openradar.appspot.com/11226270)。 – 2012-04-11 12:26:04

4

如果你想要的是自动完成的,而不是符号化,您可以通过使用一个普通的NSTextField和执行委托方法实现这一目标:(这种方法实际上是在的NSControl声明的NSTextField的超)

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

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

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

0

要做到这一点的最佳方式(如Cocoafan指出的)是使用Value Transformers。值转换器允许您将用于模型的对象类型转换为适合视图的类型。这是一个非常简单的字符串/数组转换器,它允许您将数据存储为逗号分隔的字符串,但会将其转换为字符串数组。

@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,如下所示。

Setting the Value Transformer Binding for NSTokenField