2010-04-25 18 views
1

好吧,我對Cocoa和Objective-C相當陌生,並且一般都是OOP。NSDocument子類未由NSWindowController關閉?

作爲背景,我正在研究將用戶文檔存儲在包中的可擴展編輯器。這當然需要一些「樂趣」來解決NSFileWrapper的一些問題(即,有些鬼鬼祟祟的寫入和加載過程以避免爲捆綁中的每個單個文檔製作NSFileWrappers)。我得到的解決方案基本上將我的NSDocument子類視爲一個shell - 使用它來創建該文件夾,然後將文檔的實際內容寫入其他方法。

不幸的是,在某些時候,我似乎已經完全搞砸了。我不知道這是怎麼發生的,但關閉文檔窗口不再釋放文檔。即使窗口成功關閉,文檔對象似乎也不會收到「關閉」消息或任何相關消息。

最終的結果是,如果我啓動我的應用程序,創建一個新文檔,保存它,然後關閉它,並嘗試重新打開它,文檔窗口永遠不會出現。通過一些有創意的子類和NSLogging,我設法弄清楚文檔對象仍然在內存中,並且仍然附着在NSDocumentController實例上,所以試圖打開文檔永遠不會超過NSDocumentController's「嗯,目前有一個打開」檢查。

我確實有一個NSWindowControllerNSDocumentController實例,但我已經從我的項目中徹底清除了它們。我已經覆蓋了幾乎所有的方法NSDocument試圖找出問題所在。據我所知,我的界面生成器綁定都是正確的 - 主菜單中的「關閉」附加到First Responder的performClose:等,並且我嘗試了新鮮的未屏蔽的MainMenu和Document xib。

我認爲這可能是一些奇怪的事情,我的包編寫代碼,所以我基本上全部刪除它,並從頭開始,但似乎沒有工作。我拿出我的-init方法覆蓋,這也沒有幫助。我在這裏沒有任何簡單的文檔應用程序的來源,所以我沒有嘗試下一個邏輯步驟(用readFromUrlwriteToUrl方法替代我的已知代碼)。

我已經有這個問題了大約十六個小時的不間斷的故障排除現在,不用說,我在我的繩索結束。如果我無法弄清楚,我想我會從頭開始嘗試這個項目,並且基於捆綁文檔混亂的代碼和強度。

回答

1

很難說沒有代碼,但我會建議發送:

closeAllDocumentsWithDelegate:didCloseAllSelector:contextInfo: 

...到文檔控制器,然後在控制器看,因爲它是傳遞給委託怎麼看它的狀態變化。

如果控制器在您發送顯式消息時關閉文檔,那麼您的問題是綁定到窗口。

+0

謝謝 - 我會盡快調查。 是的,我知道代碼會有幫助:(我認爲只是把整個該死的東西拉扯到我的服務器上,我想我希望不會希望它只是我自己的一個簡單白癡而已 無論如何,我將檢查出這種可能性,並回來。謝謝你的幫助:) – 2010-04-25 20:50:44

+0

是的,顯然是在界面的綁定問題。儘管我很欣賞界面生成器的簡易性,但我認爲它現在不適合我。我需要能夠看到代碼的地方。一般來說,可可的問題有很多,因爲如此多的代碼是沒有我真正理解的東西。 我想我有很多工作要做,然後纔開始有意義。 感謝您的幫助! – 2010-04-26 03:02:04

+0

是的,這是一個非常普遍的問題。我已經使用這些工具已有13年了,他們仍然讓我感動。這是一種易用性與內部複雜性的折衷。讓IB爲你自動完成所有這些工作是非常棒的,但如果它破裂了,很難知道沒有經驗的情況下它破裂的地方。 – TechZen 2010-04-26 14:41:10