0

У меня есть массив NSDictionaries и NSDictionary iVar (* selectedDictionary), который указывает на один из объектов массива. * selectedDictionary указывает на другой объект каждый раз, когда пользователь выбирает другую строку в NSTableView. Несколько элементов управления графическим интерфейсом привязаны к экземпляру selectedDictionary (IB).Сделать NSDocument «отредактированным» при изменении привязанного управления

Я просто хочу сделать NSDocument грязным (отредактированным) каждый раз, когда пользователь изменяет вышеуказанные элементы управления. Я думаю, что с помощью Key Value Observing для ВСЕХ объектов в массиве и всех их kaypaths немного недостаточно. Какие-либо предложения?

Благодаря

ответ

0

поддержки NSDocument для маркировки документа как грязная поступает непосредственно из NSUndoManager. Самый простой способ изменить документ на загрязнение - это сделать реализацию Undo, и это в основном означает отмену внутри класса модели, используемого документом (или подкласс NSDocument, если вы решите обрабатывать все хранилища прямо там).

Яблоко документации по этому вопросу здесь: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/UndoArchitecture/Articles/AppKitUndo.html

Поскольку вы указываете, у вас есть массив словарей, что собирается сделать это немного больше работы для реализации, но как только вы прибили, что вы будете в хорошей форме.

В качестве альтернативы, если вы не хотите использовать поддержку халявы, предоставленную NSDocument и NSUndoManager, вы можете вручную отменить отмену и использовать метод updateChangeCount:, чтобы изменить внутреннее понимание того, произошли ли изменения. Это требует некоторой работы и, вероятно, намного менее полезно, чем просто отменить отмену.

Что касается эффективности наблюдения за всеми объектами в массиве, я бы не стал беспокоиться об этом, если вы не профилировали его и не обнаружили, что он неэффективен. KVO действительно очень эффективен, и мы регулярно наблюдаем несколько значений в каждом элементе массивов, не видя проблем с производительностью. Вы должны сами наблюдать за массивом, чтобы обрабатывать добавление и удаление (при условии, что ваши массивы имеют это).

Насколько я могу судить, у вас есть selectedDictionary, который используется для определения других элементов управления, которые показаны. В этом случае вы можете использовать KVO для наблюдения за значением selectedDictionary и при его изменении вы можете удалить наблюдателей из предыдущего выбранногоDictionary и добавить их к клавишам текущего выбранного словаря. Это в основном то, что делает привязка для обработки отображения и настройки.

Еще одно соображение, которое я использовал в прошлом, упоминается в этой статье StackOverflow: NSMutableDictionary KVO. Если вы посмотрите на мой ответ здесь, я изложил трюк для получения уведомлений при добавлении нового ключа или удалении существующего ключа. Он также имеет право дать вам уведомление при любых изменениях. Это не всегда отличное решение, но оно действительно помогает при кодировании списка ключей для наблюдения.

Кроме того, вам нужно будет добавить каждый ключ, который вы ожидаете, чтобы повлиять на сохраненное состояние документа.

+0

Спасибо за ваш ответ, я знаком с этой концепцией. Проблема, хотя и находится в другом месте: как я могу получить уведомление, когда пользователь изменяет привязку (к значениям экземпляра selectedDictionary) GUI ?? – Vassilis

+0

«... добавьте их к клавишам текущего выбранного словаря», как указано выше. В основном удалить старый и добавить новое, когда вы наблюдаете изменение выбора. – gaige

+0

Есть ли способ добавить KVO для ВСЕХ ключей (keypaths) в «selectedDictionary» сразу? или мне нужно жестко закодировать все 40 ключей!? – Vassilis

Смежные вопросы