2011-11-16 69 views
0

我創建了新的基於文檔的應用程序。無法保存在基於文檔的應用程序中

我實現dataOfType在子類NSDocument

- (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError 
{ 
     return [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects]; 
} 

in xib http://i.minus.com/iH2Rj9v5oOhTn.png

當我在控制檯中點擊 「保存」,從菜單中沒有任何事情發生,任何錯誤。 我在dataOfType中設置了一個斷點,當我點擊「保存」時,應用程序沒有停止。

有什麼建議嗎?

編輯

我想這可能與事實我使用自定義NSWindowController,和自定義廈門國際銀行連接。 我做了一個測試,當我加載定製的xib,一切都很好dataOfType方法被調用等..

我應該以某種方式連接我的自定義xib(窗口)與NSDocument的子類?

+2

「當我點擊菜單中的」保存「時,控制檯中的任何錯誤都會發生。請更好地解釋這一點。 –

+0

也請注意選擇更精確的主題名稱。 「第一個基於文檔的應用程序」告訴我們你的問題的性質完全沒有。 –

回答

0

看起來您的保存菜單項已正確連接,所以讓我們專注於代碼(首先發布+1的代碼)。

你在你的代碼中沒有做任何事情來確保-archivedDataWithRootObject:返回有效數據,或者如果沒有,則設置一個錯誤。我最好的猜測(因爲你沒有提供足夠的細節來做任何事情,除了猜測)是因爲你給-archivedDataWithRootObject:的呼叫做同樣的事情,你將返回零。檢查是否獲取有效數據,如果沒有,則設置outError。

爲什麼你會得到零?也許通過歸檔陣列控制器的-arrangedObjects陣列創建的對象圖中的一個或多個對象不符合<NSCoding>。如果您的數組控制器保存您創建的自定義類的對象而不是標準的Property List容器,則情況可能如此。

閱讀存檔和序列化編程指南(特別是Encoding and Decoding Objects部分),瞭解如何使您的自定義類<NSCoding>兼容,以便它知道如何序列化自己(將自己寫入適合NSKeyedArchiver等的字節流中並從這樣的字節流創建自己的實例)。

此外,你真的需要學習使用調試器。你在黑暗的洞穴中摸索着有很多陷阱,沒有它的話沒有手電筒。嘗試在你期望被調用的方法中設置一個斷點。如果他們沒有被叫,你可以檢查網點/行動等。如果他們是,你可以逐步通過每一行,並確保一切都按照你的預期執行。如果您編寫更詳細的代碼,則可以在調試器中暫停時更輕鬆地檢查結果。你的情況中的兩行將幫助你多於一個:

- (NSData*) dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError 
{ 
    NSData * myData = [NSKeyedArchiver archivedDataWithRootObject:bcmwc.bindingsController.arrangedObjects]; 
    // You should be handling nil (setting a descriptive error) here if (!myData)... 
    return data; // breakpoint here; you should now see myData is likely nil 
} 
+0

我在我的問題中寫道 - 問題是dataOfType方法未被調用,而不是「爲什麼歸檔不起作用?」 – badeleux

+0

你最初寫道,當你點擊保存時沒有任何反應(但沒有更多的信息)。然後你在編寫我的答案後編輯它以包含其餘部分。我回答了你最初問的問題。 –

相關問題