КВО: Невозможно удалить наблюдателя - PullRequest
4 голосов
/ 08 февраля 2012

В моем интерфейсе у меня есть NSTextField, который value связан с NSArrayController's selection.selectedType.title.Все NSArrayController's объекты являются пользовательскими объектами, каждый из которых имеет два метода:

- (MYType *)selectedType;
- (void)setSelectedType: (MYType *)type;

У нет есть iVar selectedType.Тем не менее, у них есть iVar, содержащий все MYType объекты.Код сводится к следующему:

- (MYType *)selectedType
{
   if (someIndex == 0)
        return [types objectAtIndex: 0];
    else
        return [self typeWithIndex: someIndex];
}

- (void)setSelectedType: (MYType *)type
{
     someIndex = [type index];  
}

MYType объекты получили NSString *title iVar с соответствующими @property и synthesize.

Всякий раз, когда я звоню setSelectedType:,изменения сразу видны в NSTextField, и все, кажется, работает, но я получаю сообщение в журнале, говорящее:

Невозможно удалить наблюдатель NSArrayController 0x141160 для пути ключа «selectedType.title» из MYType 0x1a4830скорее всего потому, что значение для ключа selectedType изменилось без отправки соответствующего уведомления KVO.Проверьте соответствие KVO класса MYType.

Я попытался инкапсулировать метод setSelectedType: с willChangeValueForKey: и didChangeValueForKey:, а затем я все еще получил сообщение журнала, но другое:

Невозможно удалить наблюдателя NSKeyValueObservance 0x1c7570 для ключевого пути "title" из MYType 0x1a4be0, поскольку он не зарегистрирован в качестве наблюдателя.

Ответы [ 2 ]

5 голосов
/ 08 февраля 2012

Сначала используйте аксессоры. Не обращайтесь к своим иварам напрямую. Вы обходите КВО на someIndex, потому что вы модифицируете ивар напрямую. Не прикасайтесь к ивару напрямую, если нет необходимости.

Вам также нужно сообщить KVO, что selectedType зависит от someIndex (и / или someStuff; это не ясно из вашего перегруженного кода).

+ (NSSet *)keyPathsForValuesAffectingSelectedType
{
  return [NSSet setWithObjects:@"someIndex", nil];
}

Это говорит системе KVO, что всякий раз, когда someIndex изменяется, это вызывает неявное изменение в selectedType. См. Регистрация зависимых ключей .

0 голосов
/ 28 июля 2017

Я столкнулся с той же ошибкой, но по другой причине. Вероятно, стоит упомянуть об этом на случай, если кто-то еще окажется здесь.

Я пишу приложение в Swift, и я забыл добавить префикс к dynamic

...