Как отключить автоматическое повторное открытие последнего документа?


Как отключить автоматическое повторное открытие последнего документа?


Когда я выполняю свое приложение, оно вызывает метод readFromData,

Но проблема в том, что между моей версией 1 и версией 2 я изменил структуру данных, сохраняемых приложением. В v1 корневой объект был массивом. В v2 корневой объект представляет собой словарь с двумя ключами, один для строки и один для массива.

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

Что мне делать!!??

PS: я пытался создать NSApplicationDelegate с

        -(BOOL)applicationShouldOpenUntitledFile:(NSApplication*)app
        {
            return YES; 
        }


        - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender
        {
            return YES ;
        }

но эти методы никогда не вызываются моим приложением.


РЕДАКТИРОВАТЬ:

Вот стек вызовов:

0   CoreFoundation                      0x00007fff8bc06f56 __exceptionPreprocess + 198
1   libobjc.A.dylib                     0x00007fff81f37d5e objc_exception_throw + 43
2   CoreFoundation                      0x00007fff8bc931be -[NSObject doesNotRecognizeSelector:] + 190
3   CoreFoundation                      0x00007fff8bbf3e23 ___forwarding___ + 371
4   CoreFoundation                      0x00007fff8bbf3c38 _CF_forwarding_prep_0 + 232
5   dictionnaireDouchoutique            0x0000000100007f22 -[Document readFromData:ofType:error:] + 498
6   AppKit                              0x00007fff89af3558 -[NSDocument readFromURL:ofType:error:] + 665
7   AppKit                              0x00007fff8999198c -[NSDocument _initForURL:withContentsOfURL:ofType:error:] + 151
8   AppKit                              0x00007fff89991890 -[NSDocument initForURL:withContentsOfURL:ofType:error:] + 360
9   AppKit                              0x00007fff89991677 -[NSDocumentController makeDocumentForURL:withContentsOfURL:ofType:error:] + 199
10  AppKit                              0x00007fff8999150f __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_5 + 150
11  AppKit                              0x00007fff89991467 __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_4 + 697
12  AppKit                              0x00007fff899911a9 -[NSDocumentController _openDocumentWithContentsOfURL:usingProcedure:] + 530
13  AppKit                              0x00007fff89990d95 __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_3 + 242
14  libdispatch.dylib                   0x00007fff86329a82 _dispatch_call_block_and_release + 18
15  libdispatch.dylib                   0x00007fff8632b8f2 _dispatch_main_queue_callback_4CF + 308
16  CoreFoundation                      0x00007fff8bb9be7c __CFRunLoopRun + 1724
17  CoreFoundation                      0x00007fff8bb9b486 CFRunLoopRunSpecific + 230
18  HIToolbox                           0x00007fff87d652bf RunCurrentEventLoopInMode + 277
19  HIToolbox                           0x00007fff87d6c56d ReceiveNextEventCommon + 355
20  HIToolbox                           0x00007fff87d6c3fa BlockUntilNextEventMatchingListInMode + 62
21  AppKit                              0x00007fff8973d779 _DPSNextEvent + 659
22  AppKit                              0x00007fff8973d07d -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135
23  AppKit                              0x00007fff897399b9 -[NSApplication run] + 470
24  AppKit                              0x00007fff899b5eac NSApplicationMain + 867
25  dictionnaireDouchoutique            0x00000001000075d2 main + 34
26  dictionnaireDouchoutique            0x0000000100001984 start + 52

3 ответа

Решение

Используйте NSPropertyListSerialization для десериализации данных, затем используйте respondsToSelector: или же isKindOfClass: проверяет, какой тип корневого объекта вам передали. Если это массив, обработайте это; если это словарь, обработайте это; если это что-то, что вы не можете распознать, верните ошибку, указывающую, что файл является мусором.

В вашем NSDocument подкласс, переопределить + (BOOL)autosavesDraft и вернуться NO, и вы будете в безопасности во время вашего развития. Однако, как только вы приступите к работе, вы должны обрабатывать файлы разных форматов без сбоев...

Вы не перечислили, как вы реализовали readFromData:, но если вы используете NSKeyedUnarchiver ты можешь использовать containsValueForKey: проверить объекты в data параметр.

Если вы хотите сделать старые версии несовместимыми, вы можете обнаружить старую версию и заполнить параметр ошибки.

Другие вопросы по тегам