0

В Aaron Hillegass' Cocoa Programming for Mac OS X приложение Raiseman соединяет кнопку в Interface Builder (IB) к NSArrayController с отправленного действием -remove:. В классе MyDocument он реализует два метода: КВЦПонимание и воспроизводящих КВЦ Hillegass путь Вставка/удаление объектов в/из контроллеров

- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index; 
- (void)removeObjectFromEmployeesAtIndex:(int)index; 

Когда эта кнопка нажата, метод -removeObjectFromEmployeesAtIndex: называется и выбранный Person (модель) объект удаляется из массива.

  1. Как метод remove: используется в IB вызвать метод -removeObjectFromEmployeesAtIndex: называться?
  2. Как воспроизвести этот эффект с помощью NSTreeController?
+0

Что вы пробовали с контроллером дерева, и как это случилось? Это была бы полезная информация. – Dov

+0

Скажем, у меня есть два типа узлов: папка и объект Person. В IB, установив имя класса контроллера контроллера дерева в папку «Папка» или «Человек», я могу добавить один или другой. Но это не позволяет добавлять ни папку, ни Person в зависимости от глубины в дереве или с помощью другой пары кнопок добавления и удаления. –

ответ

0

Если вы хотите простой встроенный параметр, тогда он будет создавать экземпляр класса, указанного вами в IB. Чтобы создать другой экземпляр, вам нужно будет сам его закодировать. Вы должны иметь всю необходимую информацию от контроллера дерева, чтобы вставить новый класс в нужное место в иерархии. Некоторые прилежные поиски должны дать вам код, который вам нужен.

Чтобы помочь вам разобраться, как работает механизм NSArrayController, я объясню, что я могу извлечь из моих знаний о Objective-C и во время выполнения. Objective-C - очень динамичный язык, и вы можете динамически вызывать селектор (методы). Поскольку NSArrayController знает имя своего класса (например, «Сотрудник»), его внутренняя реализация, вероятно, выглядит примерно следующим (или могли легко):

NSString *removeSelectorName = [NSString stringWithFormat:@"removeObjectFrom%@sAtIndex:", 
           self.objectClassName]; 
SEL removeSelector = NSSelectorFromString(removeSelectorName); 

[dataRepresentation performSelector:removeSelector 
         withObject:[NSNumber numberWithInt:self.selectionIndex]; 

Есть примеры этого в другом месте в КВО, как и с +keyPathsForValuesAffecting<Key> (documentation here), в котором описаны ключи, вызывающие обновление другого ключа. Если ключ называется fullName и обновляет каждый раз, когда первые или последние изменения имени, вы можете реализовать это в своем классе:

+ (NSSet *)keyPathsForValuesAffectingFullName { 
    return [NSSet setWithObjects: 
      @"firstName", 
      @"lastName", 
      nil]; 
} 

Далее поиск (и this question) превратили этот documentation page, что объясняет семантику, как это метод вызывается.

+0

В любом случае, как метод remove:, используемый в IB, вызывает вызов метода -removeObjectFromEmployeesAtIndex: с KVC? –

+0

Обновлено с объяснением. – Dov

+0

Я видел эту страницу вопросов и документации ранее. В нем говорится: «Шаблон поиска по умолчанию для mutableArrayValueForKey: есть ...» Проблема в том, что кто-то знает, что insert: вызывает mutableArrayValueForKey: (если это действительно так) - где находится документация? Прямо сейчас Hillegass и другие используют его, но не говорят, как они знали, чтобы использовать его. Спасибо. –