Отключить отмену для создания / удаления NSManagedObject - PullRequest
8 голосов
/ 23 апреля 2009

В моей модели базовых данных у меня есть отношение, называемое listItems, которое ссылается на несколько listItem сущностей, каждая с атрибутом stringValue. Я создал элемент управления, который по сути является списком NSTextFields, по одному для каждого элемента списка. Элемент управления привязан к listItems должным образом, и я настроил его так, что нажатие клавиши возврата создает новое поле непосредственно под редактируемым в данный момент и изменяет фокус на новое поле. Таким образом, чтобы добавить новый элемент, пользователь нажимает Return.

Аналогичным образом, если пользователь заканчивает редактирование, а редактируемое в настоящий момент поле пусто, поле удаляется (как, например, пустые поля появляются только в «режиме редактирования», так сказать). Это работает довольно хорошо. По сути, в моем подклассе listItem NSManagedObject я делаю следующее:

// Don't allow nil values
if (!value && [[self.recipe ingredients] count] > 1) {
    for (EAIngredientRef *ingredient in [self.recipe ingredients]) {
        if ([[ingredient sortIndex] integerValue] > [[self sortIndex] integerValue]) {
            [ingredient setSortIndex:[NSNumber numberWithInteger:([[ingredient sortIndex] integerValue]-1)]];
        }
    }
    [[self managedObjectContext] deleteObject:self];
    return;
}

// Code to handle if it is a real value

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда строка удаляется таким образом, она регистрируется в undoManager. Таким образом, если я редактирую строку, нажимаю Return (что создает новую строку) и щелкаю, чтобы закончить редактирование, строка исчезает. Однако, если я затем отменю, пустое поле появляется снова. Моя цель - сделать так, чтобы операции удаления, включающие пустые поля, игнорировались undoManager.

Как бы я поступил об этом? Я пытался использовать [[[self managedObjectContext] undoManager] disableUndoRegistration] и связанный enableUndoRegistration в нескольких местах (например, -didTurnIntoFault, но я подозреваю, что регистрация отмены могла происходить до этого метода)

1 Ответ

19 голосов
/ 23 апреля 2009

Если вы глубже погрузитесь в документацию по основным данным, вы обнаружите, что этот кусочек скрыт:

[[self managedObjectContext] processPendingChanges];
[[[self managedObjectContext] undoManager] disableUndoRegistration];
// Do your work
[[self managedObjectContext] processPendingChanges];
[[[self managedObjectContext] undoManager] enableUndoRegistration];

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

...