我已将NSTextField
替换为NSTokenField
,以便我可以执行一些自动完成功能。 NSTextField
的值绑定到控制器类的NSString
属性。既然我已将NSTextField
更改为NSTokenField
,则该值已更改为NSArray
。
如何将NSTokenField
值绑定设为NSString
?
将值从NSString
更改为NSArray
似乎是糟糕的OO设计。我认为子类应该能够在不对子类进行任何修改的情况下替换超类。
答案 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
。