Кво: нельзя удалить наблюдателя
В моем интерфейсе у меня есть 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
. См. Раздел Регистрация Зависимых Ключей .