1) Почти, но не совсем. Если вы думаете, что код вашего приложения разделен на три общие области: Модель, Представление и Контроллер (, как описано здесь ), то среда Cocoa / XCode предоставляет вам «свободный от кода» способ обработки основ каждого: IB для представления, Базовые данные для модели и Привязки / Контроллеры объектов для контроллера.
Управление отменой - это в первую очередь проблема модели, а не представления или контроллера. Так что это не совсем Bindings или работа контроллера объекта, чтобы управлять этим материалом. Похоже, ваша проблема в том, что вы используете массивы в качестве объектов данных, которые слишком легки для обработки этих вещей. Если вы хотите отменить поддержку, вы захотите использовать базовые данные для обработки модели и бесплатно предоставить вам этот материал, или прокрутите вручную свои собственные объекты модели (которые, вероятно, будут содержать массивы), которые обрабатывают эта логика.
FWIW, как только вы это сделаете, привязки косвенно сделают вашу жизнь намного проще, так как когда команда отмены возвращает ваши данные в прежнее состояние, представление автоматически отражает изменения.
Кроме того, имя NSArrayController немного вводит в заблуждение - оно не предназначено для «управляющих массивов». Это действительно для управления объектами данных, которые имеют множество связей с другими объектами данных. Что приводит меня к ...
2) KVC позволяет трактовать отношение * ко многим между объектом и другими объектами как массив или набор независимо от того, как на самом деле эти отношения реализованы. Для этого требуется, чтобы вы реализовали методы , соответствующие соглашению об именах , которые очень близко соответствуют примитивным методам массивов и наборов . KVC-совместимые объекты возвращают массив прокси или устанавливаются при вызове mutableArrayValueForKey:
или mutableSetValueForKey:
, который предоставляет эти методы в виде массива. Грубо говоря, именно так NSArrayController знает, что вызывать --- KVC отображает между примитивными объектами массива и некоторыми методами, чьи грины он генерирует из ключа. Поскольку вы не хотите использовать массивы в качестве объектов данных, обычно очень полезно иметь возможность рассматривать любое отношение «многие-многие», как если бы оно было просто обычной коллекцией.
3) Я думаю, это связано с тем, что вы обрабатываете отмену в неправильном месте. Реализуйте KVC-совместимые методы , чтобы получить / установить свойства в ваших объектах данных, чтобы они обновляли undoManger одновременно с настройкой данных. Вам понадобится специальный метод отмены менеджера, чтобы отменить изменения, так как вы не хотите, чтобы отмены записывались как отменяемые. Или вы можете просто использовать Core Data и получить все это бесплатно ...