2009-01-14 58 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