Как отключить автоматическое повторное открытие последнего документа?
Как отключить автоматическое повторное открытие последнего документа?
Когда я выполняю свое приложение, оно вызывает метод 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
параметр.
Если вы хотите сделать старые версии несовместимыми, вы можете обнаружить старую версию и заполнить параметр ошибки.