Кво: нельзя удалить наблюдателя
В моем интерфейсе у меня есть 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 ответа:
Во-первых, используйте средства доступа. Не доступ к Ивар напрямую. Вы обходите кво для
someIndex, потому что вы непосредственно модифицируете Ивар. Не прикасайся к айварсу напрямую, если это не нужно.Вам также нужно сообщить KVO, что
selectedTypeзависит отsomeIndex(и/илиsomeStuff; это не ясно из вашего дистиллированного кода).Это говорит системе кво, что всякий раз, когда+ (NSSet *)keyPathsForValuesAffectingSelectedType { return [NSSet setWithObjects:@"someIndex", nil]; }someIndexизменяется, это вызывает неявное изменение вselectedType. См. Раздел Регистрация Зависимых Ключей .