2011-01-25 4 views
0

Я создал подклассом NSTextField для создания настраиваемого элемента управления, и я хочу привязать свойство (которое является NSArray) моего настраиваемого элемента управления к NSArrayController. Однако я не знаю, как передать массив из моего элемента управления в NSArrayController. Ключ-путь, который я использую на NSArrayController, - arrangedObjects.name. Например, если я пытаюсь распространить массив (@"One", @"Two", @"Three") и я просто использую:Связать пользовательский контроль с NSArrayController

[boundObject setValue:myArray forKeyPath:@"arrangedObjects.name"] 

будет установить значение каждого элемента arrangedObjects.name в массив (@"One", @"Two", @"Three"). То, что я хочу, чтобы это произошло, чтобы иметь первый элемент arrangedObjects.name установлен в @"One", второе значение, установленное в @"Two" и т.д.

NSTableColumn делает это, так что я знаю, что это возможно, но я не могу понять, как это реализованы.

Каков наилучший способ достичь этого?

+0

Вам нужно будет предоставить немного больше информации о вашем новом настраиваемом свойстве. Пожалуйста, дополните. –

+0

Это просто 'NSArray *', называемый 'customContent' (из-за отсутствия лучшего имени), который соответствует требованиям KVO. Я хочу иметь возможность привязать его к 'NSArrayController' (двунаправленно). Но все, что мне действительно нужно сделать, я предполагаю, что нужно правильно установить ключ-путь 'builtObjects.name' (как описано выше) в' NSArrayController'. –

ответ

0

Хорошо, я думаю, что, возможно, я ответил на свой вопрос. Я не буду отмечать его как правильный ответ сразу, если кто-то может сказать мне лучший способ сделать это. Этот способ в значительной степени является взломом.

Во всяком случае, я читал о NSArrayController здесь: http://www.cocoadev.com/index.pl?NSArrayController, который говорит:

Если valueForKeyPath:@"arrangedObjects.name" отправляется на контроллер массива, один (как и ожидалось) возвращается массив значений имен, но если другой объект повторах это поведение, а значение столбца таблицы привязано к этому объекту, оно отображает весь массив для каждой строки.

и

привязываются Значение NSTableColumn к arrangedObjects.someKey. Если вы попытаетесь программным образом вызвать valueForKeyPath:@"arrangedObjects.someKey" на контроллере массива, вы вернете массив, вызванный вызовом valueForKey:@"someKey" в массиве arrangedObjects - все в порядке. Поэтому можно было бы подумать, что значение NSTableColumn также может быть привязано к моим объектам someArray.someKey, но это не сработает (на нескольких уровнях).

Так в основном это звучит как NSTableColumn особых случаях его привязок для NSArrayController и arrangedObjects, поэтому он работает правильно, и мой пользовательский элемент управления не делает.

Это не кажется очень гибким, но это единственный способ найти, что он действительно работает. Я применил специальный случай в моих привязках к NSArrayController и builtObjects, и я смог заставить его работать так, как я хотел.

Лучшее решение было бы очень признательно, хотя!

+0

Не зная больше о реализации, я бы сказал, что неправильно хранить массив в NSTextField.Обычно содержимое хранится и управляется контроллером. Текстовое поле должно просто быть каналом для этого содержимого между пользователем и контроллером. Например, предположим, что у меня есть NSTextField, и я прошу пользователя ввести серию значений, разделенных запятыми (т. Е. Базового массива). У меня был бы контроллер, который берет строку из текстового поля, а затем анализирует и сохраняет содержимое в контроллере. – sosborn