Objective-C отменить вопросы менеджера - PullRequest
4 голосов
/ 12 июня 2011

Я читаю книгу о Objective-c и узнаю о менеджере отмены.Концепция кажется очень простой, но приведенный пример кажется слишком сложным.По сути, у меня есть табличное представление, подключенное к NSArrayController, и я добавляю или удаляю людей в массив, и я могу редактировать их имена и прочее.Поскольку в примере используются NSArrayController и привязки, добавление и удаление выполняются автоматически, а все редактирование выполняется автоматически.

Чтобы использовать диспетчер отмены, из того, что я понимаю, мне нужно реализовать свои собственные методы добавления / удаления /edit.

Эти методы, которые я реализовал для добавления, удаления и автоматического вызова из-за кодирования значения ключа:

- (void)removeObjectFromEmployeesAtIndex:(int)index;
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index;

Затем для редактирования мне пришлось зарегистрировать класс какНаблюдатель и наблюдать изменения для редактирования:

- (void)changeKeyPath:(NSString *)keyPath
             ofObject:(id)obj
              toValue:(id)newValue

Вот мои вопросы:

  1. Почему я должен делать так много?Насколько я понимаю, использование NSArrayController и привязок должно было упростить и ускорить процесс добавления / удаления / редактирования элементов.Но если мне все равно придется реализовать все эти методы вручную, просто чтобы добавить поддержку отмены, зачем вообще использовать NSArrayController или привязки?

  2. Что происходит за кулисами?В Интерфейсном Разработчике кнопка добавления связана с методом добавления на NSArrayController.Как тогда вызывается мой метод insertObject?Я знаю, что это происходит посредством кодирования значения ключа, но что делает метод добавления NSArrayController переопределенным, просто потому что мой документ реализует этот метод?

  3. Решение асимметричное.Я использую одну концепцию для обработки отмены добавления / удаления и другую концепцию для обработки отмены редактирования.Разве я не могу просто наблюдать за изменениями в массиве?Я полагаю, что это усложнит метод наблюденийValueForKeyPath, но имеет ли это смысл?

1 Ответ

2 голосов
/ 15 июня 2011

1) Почти, но не совсем. Если вы думаете, что код вашего приложения разделен на три общие области: Модель, Представление и Контроллер (, как описано здесь ), то среда Cocoa / XCode предоставляет вам «свободный от кода» способ обработки основ каждого: IB для представления, Базовые данные для модели и Привязки / Контроллеры объектов для контроллера.

Управление отменой - это в первую очередь проблема модели, а не представления или контроллера. Так что это не совсем Bindings или работа контроллера объекта, чтобы управлять этим материалом. Похоже, ваша проблема в том, что вы используете массивы в качестве объектов данных, которые слишком легки для обработки этих вещей. Если вы хотите отменить поддержку, вы захотите использовать базовые данные для обработки модели и бесплатно предоставить вам этот материал, или прокрутите вручную свои собственные объекты модели (которые, вероятно, будут содержать массивы), которые обрабатывают эта логика.

FWIW, как только вы это сделаете, привязки косвенно сделают вашу жизнь намного проще, так как когда команда отмены возвращает ваши данные в прежнее состояние, представление автоматически отражает изменения.

Кроме того, имя NSArrayController немного вводит в заблуждение - оно не предназначено для «управляющих массивов». Это действительно для управления объектами данных, которые имеют множество связей с другими объектами данных. Что приводит меня к ...

2) KVC позволяет трактовать отношение * ко многим между объектом и другими объектами как массив или набор независимо от того, как на самом деле эти отношения реализованы. Для этого требуется, чтобы вы реализовали методы , соответствующие соглашению об именах , которые очень близко соответствуют примитивным методам массивов и наборов . KVC-совместимые объекты возвращают массив прокси или устанавливаются при вызове mutableArrayValueForKey: или mutableSetValueForKey:, который предоставляет эти методы в виде массива. Грубо говоря, именно так NSArrayController знает, что вызывать --- KVC отображает между примитивными объектами массива и некоторыми методами, чьи грины он генерирует из ключа. Поскольку вы не хотите использовать массивы в качестве объектов данных, обычно очень полезно иметь возможность рассматривать любое отношение «многие-многие», как если бы оно было просто обычной коллекцией.

3) Я думаю, это связано с тем, что вы обрабатываете отмену в неправильном месте. Реализуйте KVC-совместимые методы , чтобы получить / установить свойства в ваших объектах данных, чтобы они обновляли undoManger одновременно с настройкой данных. Вам понадобится специальный метод отмены менеджера, чтобы отменить изменения, так как вы не хотите, чтобы отмены записывались как отменяемые. Или вы можете просто использовать Core Data и получить все это бесплатно ...

...