Дерево не является одной структурой данных так же, как и массив. Вы либо начинаете с одного корневого узла, и в этом случае свойство является отношением к одному узлу или массиву узлов верхнего уровня, и в этом случае свойство является отношением 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
во все ваши пользовательские классы. Это может поймать такие вещи, как орфографические методы/имена свойств.
Уход за избирателем, объясняющим темуlves? – insys