Как сделать привязку значений NSTokenField к NSString? - PullRequest
2 голосов
/ 14 января 2009

Я заменил NSTextField на NSTokenField, чтобы я мог выполнить автозаполнение. Значение NSTextField было привязано к атрибуту NSString класса контроллера. Теперь, когда я изменил NSTextField на NSTokenField, значение изменилось на NSArray.

Как сделать привязку значения NSTokenField NSString?

Изменение значения с NSString на NSArray кажется плохим дизайном ОО. Я считаю, что подкласс должен иметь возможность заменить суперкласс без каких-либо изменений в подклассе.

Ответы [ 4 ]

4 голосов
/ 21 мая 2009

Если все, что вам нужно, это автозаполнение, а не токенизация, вы можете добиться этого с помощью простого NSTextField и реализации метода делегата:

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

(Этот метод фактически объявлен в NSControl, суперклассе NSTextField.)

Если вы хотите использовать токенизацию, вам нужно будет предоставить NSArray для значения объекта, которое будет отображаться в поле токена. Как описано в руководстве по программированию NSTokenField , предоставленный вами массив будет представлять собой смесь строк и объектов. Строки будут отображаться как есть, а любые нестроковые объекты будут отображаться как токены в поле токена. Вам потребуется реализовать различные методы делегата NSTokenField, чтобы обеспечить строку, отображаемую для каждого представленного объекта в вашем массиве.

Похоже, что Ссылка на привязку какао гласит, что объект, связанный со значением NSTokenField, должен быть строкой или числом, но, по моему опыту, это неверно, и поле токена должно быть привязанный к NSArray, как при использовании setObjectValue:

2 голосов
/ 23 мая 2009

Вы можете создать подкласс для своего собственного NSValueTransformer и установить его в своем связывании.

1 голос
/ 17 января 2009

Привязка значений NSTokenField принимает привязку NSString или NSNumber, а не NSArray. Как вы определили, что он хочет NSArray?

0 голосов
/ 18 февраля 2016

Лучший способ сделать это (как указал 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, то для использования этого преобразователя просто выберите NSTokenField в Интерфейсном Разработчике, а затем в Инспекторе привязок справа для привязки Значения установите «Преобразователь значения» на 1006 * согласно ниже.

Setting the Value Transformer Binding for NSTokenField

...