2015-05-13 2 views
-1

В this document Apple описывает шаблоны Accessor для свойств To-One и To-Many. К-многим свойствам относятся индексированные и неупорядоченные коллекции.Образцы аксессуаров KVC для деревьев

подводит меня к вопросу:
Есть различный Accessor шаблон для древовидных структур, или мы должны использовать (или адаптировать) так же, как и для других типов коллекций?

По-видимому, ОСУЩЕСТВЛЕНИЕ индексированные ко многим аксессоров в моей модели и установки контрольных точек в них не имеет никакого эффекта, когда NSArray держит структуру дерева связан с NSTreeController. Модель обновляется правильно, например. при добавлении/удалении элементов или изменении их упорядочивания, но реализации Accessor никогда не вызываются.

Я что-то упустил?

+0

Уход за избирателем, объясняющим темуlves? – insys

ответ

1

Дерево не является одной структурой данных так же, как и массив. Вы либо начинаете с одного корневого узла, и в этом случае свойство является отношением к одному узлу или массиву узлов верхнего уровня, и в этом случае свойство является отношением to-many к этим узлам. Другими уровнями дерева являются отдельные отношения от этих корневых узлов, а не от объекта, предоставляющего корневые узлы.

NSTreeController сконфигурирован с ключом для детей. Он использует этот путь ключа для каждого узла для доступа к дочерним элементам каждого узла. Если это добавление или удаление узлов, это будет мутация дочерних элементов родительского узла через KVC. (Вероятно, он использует -mutableArrayValueForKeyPath: для родительского, а затем NSMutableArray методов в результирующем прокси.) Это должно пройти через ассемблеры мутаций коллекции индексов на родительском объекте.

Вы уверены, что внедрили аксессоры в правильном классе (и задали контрольные точки на них)?

У рамки действительно нет другого выбора, кроме как использовать KVC для доступа и изменения вашей собственности. KVC будет использовать ваши методы доступа, если они являются собственностью. В зависимости от того, как вы реализовали свой класс, KVC может не иметь другого выбора, кроме как вызвать ваши методы доступа. Например, вы можете реализовать свойство индексированной коллекции без какого-либо массива или сеттера с массивом или любой переменной экземпляра массива, чтобы вернуть его (или он мог иметь переменную экземпляра, имя которой полностью не связано с именем свойства).

Например, класс может реализовать:

- (NSUInteger) countOfEmployess; 
- (id) objectInEmployeesAtIndex:(NSUInteger)index; 
- (void)insertObject:(id)anObject inEmployeesAtIndex:(NSUInteger)index; 
- (void)removeObjectFromEmployeesAtIndex:(NSUInteger)index; 

без каких-либо -employees или -setEmployees: аксессорах, ни какой-либо переменной или employees_employees экземпляра. Он по-прежнему будет полностью соответствовать требованиям KVC для индексированного свойства коллекции с именем «сотрудники». Если NSTreeController был предоставлен такой узел и настроен на использование «служащих» в качестве ключевого пути для детей, он мог бы прекрасно управлять сотрудниками этого узла. Что он может использовать, если не эти методы доступа?

Только для хорошей меры обязательно внесите +accessInstanceVariablesDirectly, чтобы вернуть NO во все ваши пользовательские классы. Это может поймать такие вещи, как орфографические методы/имена свойств.

+0

Спасибо за объяснение, это имеет смысл. Я создал тестовый проект и подтвердил, что методы KVC действительно вызываются при добавлении/удалении и т. Д. Виной здесь оказался метод -moveNodes: toIndexPath: метод NSTreeController, который, по-видимому, не использует стандартные методы KVC для выполнения это долг.Я приму свой ответ и открою новый вопрос по этой теме. – insys