Файл маркировки базовых данных / NSPersistentDocument «очищается» каждый раз, когда редактируется любое поле - PullRequest
1 голос
/ 24 декабря 2010

Я работаю с основанным на документе приложением OS X с основными данными. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я редактирую любое поле в документе, после того, как я нажимаю клавишу Tab или нажимаю на что-то еще (т.е. я заканчиваю редактирование / изменение фокуса), документ помечается как чистый и отмена отменяется. Однако когда я пытаюсь сохранить файл, полученный документ открывается без введенных мной данных. В чем может быть проблема, или какие-либо указатели на то, где искать, чтобы исправить это? Вот кое-что, что я знаю, и то, что я уже пробовал:

Я знаю, что это не каким-то образом сохраняется, потому что он никогда не останавливается на точке останова в моем переопределенном writeSafelyToURL:(NSURL *)inAbsoluteURL ofType:(NSString *)inTypeName forSaveOperation:(NSSaveOperationType)inSaveOperation error:(NSError **)outError и никогда не отправляет NSManagedObjectContextDidSaveNotification.

Документы упакованы в каталог NSFileWrapper с основным хранилищем данных (а также некоторыми другими файлами). Я получаю доступ к сущностям через NSObjectController и пару NSArrayController s. Это происходит как со свойствами основных данных, так и с зарегистрированными вручную изменениями в остальной части оболочки файла.

Обновление: по предложению Мартина я попробовал уведомления NSUndoManager, и все, что я могу извлечь из этого, - это то, что в игре более одного менеджера отмены. Если я добавлю наблюдателя для NSUndoManager, он не будет публиковать, если я укажу объект, а затем, если я этого не сделаю, объект уведомления не равен [self undoManager]. Я добавил updateChangeCount в свою категорию на NSPersistentDocument, и он никогда не вызывается. setDocumentEdited в основном подтвердил, что что-то о потере первого респондента передает НЕТ в этот метод. Что может быть причиной, и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 26 января 2011

Ответ на самом деле довольно глуп, учитывая, как долго это меня озадачило. Я работал над некоторыми объектами под нагрузкой, и я случайно установил [[self undoManager] disableUndoRegistration] в обеих точках, где я должен отключить, и включить . Хотя это было немного больше. Связанный элемент в Интерфейсном Разработчике должен быть проверен Prepares Content. Когда я сделал обе эти проблемы, проблема исчезла.

0 голосов
/ 25 декабря 2010

Вы можете воспользоваться методом setDocumentEdited: NSWindow, чтобы увидеть, какая операция обновляет статус изменения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...