Разница между mutableArrayValueForKey и вызовом insertObject: inEmployeesAtIndex: напрямую - PullRequest
1 голос
/ 12 июня 2010

У меня есть вопрос относительно использования KVO-совместимых методов для вставки / удаления объектов из массива.Я работаю через Программирование Какао Аарона Хиллегаса для Mac OS X, и я увидел следующую строку кода (в методе insertObject:inEmployeesAtIndex::

[[undoManager prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];

Исправьте меня, если я ошибаюсь, но я всегдаЯ подумал, что лучше позвонить mutableArrayValueForKey:, а затем removeObjectAtIndex: ... поэтому я попытался изменить приведенную выше строку следующим образом:

[[undoManager prepareWithInvocationTarget:[self mutableArrayValueForKey:@"employees"]] removeObjectAtIndex:index]; 

И это не сработало. Может кто-нибудь объяснить разницу и почемупервая строка работает, а вторая - нет?

ОБНОВЛЕНИЕ: Мой метод removeObjectFromEmployeesAtIndex: index реализован для того, чтобы сделать мой класс коллекции (экземпляр NSMutableArray) KVC-совместимым. Так что в конечном итоге вызов [[self mutableArrayValueForKey:@"employees"] removeObjectAtIndex:index]; долженв итоге звоните [self removeObjectFromEmployeesAtIndex:index];

Ответы [ 2 ]

1 голос
/ 30 июня 2010

В своем обновлении вы говорите:

вызов [[self mutableArrayValueForKey: @ "employee '] removeObjectAtIndex: index];должен в конечном итоге вызвать [self removeObjectFromEmployeesAtIndex: index];

К сожалению, это не правильно, независимо от того, что находится в вашем removeObjectFromEmployeesAtIndex: методе, поскольку NSMutableArray никогда не вызовет никаких методов в вашем классе.Поскольку вы, похоже, пытаетесь получить функциональность отмены / повтора, вы должны использовать метод, подобный removeObjectFromEmployeesAtIndex:.В противном случае, когда вы нажмете «Отменить» для добавления сотрудника, у вас не будет возможности «повторить» добавление этого сотрудника.У вас также могут возникнуть проблемы с отменой / возвратом для редактирования отдельных сотрудников.Если вы хотите, вы можете изменить строку в методе removeObjectFromEmployeesAtIndex:, который читает [employees removeObjectAtIndex:index]; на [[self valueForKey:@"employees"] removeObjectAtIndex:index]; или [self.employees removeObjectAtIndex:index];, но на самом деле нет причин идти по этому пути.

0 голосов
/ 28 июня 2010

Да. Первая строка (из книги) в основном эквивалентна этому:

id tmp = [undoManager prepareWithInvocationTarget:self];
[tmp removeObejctFromEmployeesAtIndex:index];

Ваш код, однако, в основном эквивалентен этому:

id tmp1 = [self mutableArrayValueForKey:@"employees"];
id tmp2 = [undoManager prepareWithInvocationTarget:tmp1];
[tmp2 removeObjectAtIndex:index];

Другими словами, цель, с которой вы готовите вызов, отличается в вашем коде (если self не совпадает с объектом [self mutableArrayValueForKey:@"employees"], что сомнительно).

...