Заполнить новые NSPersistentDocuments начальными объектами/отменить изменения при закрытии

Вот моя проблема:

У меня есть приложение на основе документов, написанное с использованием Core Data. Когда создается новый документ (при запуске приложения или с помощью команды «Файл» > «Создать» или Cmd+N), мне нужно, чтобы этот документ был заполнен исходными начальными объектами. Допустим, мой документ представляет собой записную книжку, поэтому я хочу, чтобы новый документ содержал пустую заметку при создании. Итак, я невинно вставляю свои объекты (-[NSEntityDescription initWithEntity: insertIntoManagedObjectContext:), и это работает.

Моя проблема заключается в том, что документ выглядит отредактированным сразу после открытия. Это ужасный UX. Более того, при закрытии этого документа без внесения каких-либо дополнительных изменений пользователю предлагается сохранить его (очень надоедливо!).

Итак, до сих пор я пытался решить эту проблему, устанавливая действия как отбрасываемые в моем менеджере отмены (с -[NSUndoManager setActionIsDiscardable:] по YES на [myDocument undoManager]). Но это ничего не меняет.

Для отладки я переопределял -[NSDocument isDocumentEdited] и всегда возвращал NO. Это частично решает проблему. Конечно, я не хочу иметь дело с этим материалом, я думаю, это должно быть исправлено на стороне контекста менеджера отмены/постоянного документа/управляемого объекта.

Кто-нибудь сталкивался с такой же проблемой?

Всем большое спасибо!


person Micha Mazaheri    schedule 20.10.2013    source источник
comment
Я предполагаю, что вы используете NSPersistentDocument, если это так, то новые файлы создаются в памяти, поэтому пользователь должен сохранить имя файла перед закрытием документа, иначе все будет потеряно. Также есть специальный метод, который вызывается специально для вас, чтобы настроить исходные данные. Он вызывается только для новых документов. Я не помню, что это такое, но я могу найти его, если вам это нужно. Какую именно проблему вы хотите решить?   -  person Duncan Groenewald    schedule 28.10.2013
comment
Спасибо :) Я действительно не мог найти этот волшебный метод, который позволяет настроить исходные данные. Это именно то, что я пытался сделать: заставить новые документы поставляться с некоторыми начальными данными. Я думаю, что нашел способ, используя NSUndoManager. Я опубликую ответ на это. Если вы помните этот метод, пожалуйста, дайте мне знать! Спасибо. Миха   -  person Micha Mazaheri    schedule 30.10.2013


Ответы (1)


Наконец-то я нашел способ сделать это с помощью менеджера отмены removeAllActions:

- (id)initWithType:(NSString *)typeName error:(NSError *__autoreleasing *)outError`
{
    // Add your seed data in Core Data

    // Erase all actions to make the document appear as new
    [[self undoManager] removeAllActions];
}

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

person Micha Mazaheri    schedule 30.10.2013
comment
Описанный выше метод initWithType — это тот, о котором я говорил. - person Duncan Groenewald; 07.11.2013
comment
Да, но даже если вы добавите свои исходные объекты в этот метод, это загрязнит ваш стек отмен. Вот почему мне пришлось придумать это removeAllActions. Спасибо хоть! - person Micha Mazaheri; 08.11.2013