Понимание и воспроизведение KVC Hillegass Способ вставки / удаления объектов в / из контроллеров - PullRequest
0 голосов
/ 13 декабря 2011

В программе Aaron Hillegass ' Cocoa для Mac OS X приложение Raiseman подключает кнопку в Интерфейсном Разработчике (IB) к NSArrayController с отправленным действием -remove:. В классе MyDocument он реализует два метода KVC:

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

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

  1. Как метод remove:, используемый в IB, вызывает метод -removeObjectFromEmployeesAtIndex:?
  2. Как воспроизвести этот эффект с NSTreeController?

1 Ответ

0 голосов
/ 14 декабря 2011

Если вам нужна простая встроенная опция, то она только создаст экземпляр класса, который вы указали в 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];

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

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

Дальнейший поиск (и этот вопрос ) обнаружил эту страницу документации , которая объясняет семантику вызова этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...