Мой пользовательский интерфейс не обновляется, когда я его ожидаю.с использованием KVO для обновления NSTableView, отфильтрованного NSPredicate
Приложение отображает «проекты», используя вид, аналогичный iTunes. Список источников слева позволяет вам фильтровать список (NSTableView) справа. Мои фильтры обновляются правильно, когда они изучают любое простое поле (например, имя, строка), но не для массивов (например, тегов).
Я удаляю тег из одного из моих объектов (из поля NSMutableArray, называемого «тегами»), и я ожидаю, что он исчезнет из списка, потому что он больше не соответствует предикату, привязанному к NSArrayController моей таблицы.
ProjectBrowser.mm:
self.filter = [NSPredicate predicateWithFormat:@"%@ IN %K",
selectedTag,
@"tags"];
Project.mm:
[self willChangeValueForKey:@"tags"];
[tags removeAllObjects];
[self didChangeValueForKey:@"tags"];
Я также попытался это, но результат тот же:
установка[[self mutableArrayValueForKey:@"tags"] removeAllObjects];
Interface Builder :
- объект ProjectBrowser является в XIb в файле Владелец
- NSArrayController (Controller Project) имеет массив содержимого, связанного с «файла Владелец» .projects
- фильтр предиката Диспетчерская Проектной обязан «Владелец файла» .filter
- Столбец NSTableView привязан к «Project Controller» .name
Благодарим вас за указание на синтаксическую ошибку, возникшую во время моей попытки извлечь соответствующий код. Я исправил его выше. – KingRufus
Я не наблюдаю за тегами, но предикат, кажется, замечает простые поля, когда это необходимо. Этот фильтр обновляет список всякий раз, когда имя изменяется: [.. predicateWithFormat: @ "% K ==% @", @ "name", selectedName] Поэтому, если я не распространяю уведомление об изменении, несмотря на мои усилия выше, как можно Я это исправим? Способность KVO наблюдать за использованием ключевых путей, таких как «project.someObject.someField», заставляет меня думать, что эти изменения должны «пузыриться» до наблюдателя, не требуя кода клея на каждой ссылке в цепочке/пути. В настоящее время массивы разрушают любую цепочку в функциональности ключа, отслеживающей ключевые слова моего кода. – KingRufus
Другое предположение: возможно, предикат оптимизирует ваше изменение, потому что вы не меняете сам объект тегов. Попробуйте '[tag release]; tags = [[NSMutableArray alloc] init]; 'вместо' [tags removeAllObjects] ' – JeremyP