3

如何禁用自動重新打開最後一個文檔?如何禁用自動重新打開最後一個文檔?


當我執行我的應用程序,它會調用方法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 
+0

爲什麼應用程序委託中的這些方法與該問題有關?他們處理新文件的創建,而不是打開現有文件。順便說一下,你的'applicationOpenUntitledFile:'實際上並沒有打開一個無標題的文件,這就是你應該在那裏做的。相反,像UNIX的'true'命令的GNU版本,你什麼也不做,成功。 –

+0

我認爲問題在於我的應用程序試圖打開最後一個文檔,因此請嘗試處理不良數據。所以,我的想法是告訴應用程序不要嘗試打開最後一個文檔。 – Colas

+1

那些方法不這樣做。他們是積極的「你應該這樣做」和「現在做」,而不是消極的「你不應該做我們的方法名稱沒有提及的其他事情」。 –

回答

1

使用NSPropertyListSerialization對數據進行反序列化,然後使用respondsToSelector:isKindOfClass:檢查來查看它傳遞給您的是哪種根對象。如果它是一個數組,則處理它;如果是字典,請處理;如果它是你不認識的任何東西,返回一個錯誤,指示the file is garbage

+0

爲什麼我的應用程序調用'readFromData',因爲我不打開保存的文檔?我只是啓動應用程序! ANYWAY,謝謝,我會嘗試你的想法! – Colas

+1

@Colas:它可能會重新打開上次打開的任何文檔。在該方法中記錄'self.fileURL'以查看哪些。 –

+0

回答:(null)... – Colas

0

你不列出你如何實現readFromData:,但如果你正在使用NSKeyedUnarchiver可以使用containsValueForKey:驗證對象在data參數中。

如果您想讓舊版本不兼容,您可以檢測舊版本並填充錯誤參數。

+0

爲什麼我的應用程序調用'readFromData',因爲我不打開保存的文檔?我只是啓動應用程序!無論如何,謝謝,我會嘗試你的想法! – Colas

2

在您的NSDocument子類中,覆蓋+ (BOOL)autosavesDraft並返回NO,您將在開發過程中保持安全。但是,一旦你正在製作,你應該處理不同的文件格式,而不會崩潰...

+0

我的模特正在改變......這就是爲什麼! – Colas

相關問題