2

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

如何使NSTokenField值绑定成为一个NSString

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

4

4 回答 4

4

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

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

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

如果您确实想要进行标记化,那么您必须提供一个 NSArray 以使对象值显示在标记字段中。正如NSTokenField 编程指南中所解释的,您提供的数组将是字符串和对象的混合。字符串将按原样显示,任何非字符串对象都将在令牌字段中显示为令牌。您需要实现各种 NSTokenField 委托方法来为数组中的每个表示对象提供要显示的字符串。

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

于 2009-05-20T23:45:43.670 回答
2

您可以子类化您自己的NSValueTransformer并将其设置在您的绑定中。

于 2009-05-23T08:55:11.780 回答
1

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

于 2009-01-17T06:38:25.237 回答
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,然后在右侧的 Bindings Inspector 中,对于 Value 绑定,将“Value Transformer”设置StringArrayTransformer为如下所示。

为 NSTokenField 设置值转换器绑定

于 2016-02-18T18:16:35.707 回答