Кво: нельзя удалить наблюдателя


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

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

У нет Ивара selectedType. Однако у них есть Ивар, удерживающий все объекты 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 Ивар с соответствующими @property и synthesize.

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

Не удается удалить наблюдатель NSArrayController 0x141160 для ключа путь " selectedType.название " от MYType 0x1a4830, большинство вероятно, потому, что значение для ключа "selectedType" имеет изменено без отправки соответствующего уведомления кво. Регистрация KVO-соответствие класса MYType.

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

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

2 4

2 ответа:

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

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

+ (NSSet *)keyPathsForValuesAffectingSelectedType
{
  return [NSSet setWithObjects:@"someIndex", nil];
}
Это говорит системе кво, что всякий раз, когда someIndex изменяется, это вызывает неявное изменение в selectedType. См. Раздел Регистрация Зависимых Ключей .

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

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