Привязка контроллера массива к «производному» атрибуту - проблема КВО? - PullRequest
2 голосов
/ 22 февраля 2010

Извините за неуклюжий заголовок.

Представьте себе простой пользовательский интерфейс для отображения имен детей человека ...

Поскольку у меня изначально был только один Person, я создал контроллер массива и привязал его к appDelegate.person1.children - это работало нормально, равно как и привязка столбца таблицы для отображения первых имен.

Однако с тех пор я расширил свою программу так, чтобы вместо «person1» в AppDelegate содержался массив или люди. Я решил, что могу просто сохранить атрибут person1 и использовать его для возврата первого элемента в списке:

- (Person *)person1{
    return [[self people] objectAtIndex:0];
}

Я подтвердил, что все создано правильно ( во время выполнения ), но я не могу получить столбец связанной таблицы для отображения имен детей person1.

Что-то с КВО? Как мне убедиться, что в таблице известно, что при изменении массива people меняется person1 (и, следовательно, пользовательский интерфейс)?

Спасибо

Ответы [ 2 ]

1 голос
/ 22 февраля 2010

Как сделать так, чтобы таблица знала, что при изменении массива people меняется person1 (и, следовательно, пользовательский интерфейс)?

Вы имеете в виду, что значение свойства person1 равно и зависит от значения свойства persons. Таким образом, первый - это то, что называется зависимым ключом .

Итак, внедрите keyPathsForValuesAffectingPerson1, чтобы вернуть набор, содержащий @"persons".

Вам также необходимо изменить значение свойства в видимой форме. Прямой разговор с массивом не приведет к его сокращению; ничто не будет знать, что значение изменилось. Как уже отмечал Радж Паван, одним из способов может быть явная отправка уведомлений о значении-воле / сделке-изменении в целом.

Другой способ, который мне гораздо проще читать и писать, - это реализовать методы доступа к массиву для свойства массива (в вашем случае, свойство persons) и использовать их исключительно средства доступа для изменения массива (за пределами init и dealloc). Когда вы звоните своим сторонникам, уведомления KVO происходят бесплатно. Это должно включать также любые зависимые ключи.

1 голос
/ 22 февраля 2010

@ "Как сделать так, чтобы таблица знала, что при изменении массива people меняется person1 (и, следовательно, пользовательский интерфейс)?"

Везде, где вы изменяете дочерний массив, убедитесь, что вы делаете это между:

    - (void)willChangeValueForKey:(NSString *)key
    - (void)didChangeValueForKey:(NSString *)key

связанного объекта.

Как:

[self willChangeValueForKey:@"children"];
[[self children] addObject: <some_new_child_object>]; // Add new child object to self.children
[self didChangeValueForKey:@"children"];
...