В моем интерфейсе у меня есть 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, поскольку он не зарегистрирован в качестве наблюдателя.