2010-10-11 69 views
7

這看起來應該很容易,但我必須錯過一些東西。我有一個基於文檔的應用程序。我還構建了一個新的XIB,它具有NSTableView和三個按鈕,我打算顯示以前的文件列表。我希望在應用程序首次啓動時顯示此XIB而不是文檔窗口。一旦用戶選擇一箇舊文件或點擊「新建」按鈕,我希望然後轉到文檔窗口。這是很常見的,我經常見到它。開始一個基於Cocoa文檔的應用程序首先顯示選擇窗口

在我試圖得到這個工作,我已經修改project-info.plist文件,並將主要的NIB文件庫名稱從MyDocument更改爲我的選擇XIB名稱。這會導致應用程序顯示選擇窗口而不是MyDocument窗口。到目前爲止,似乎沒有問題。

在我的選擇窗口中,我爲這個XIB設置了我的表視圖,一個數組控制器和一個自定義窗口控制器。我已將文件所有者設置爲新的窗口控制器,並將窗口控制器的窗口屬性綁定到窗口,並將窗口的委託屬性綁定到文件所有者以及「選擇」,「取消」和「新建」按鈕。沒有任何約束NSApplication。但奇怪的是,當我運行該應用中它似乎想這些控制器的NSApplication與錯誤(同爲其他兩個按鈕)連接:

無法連接動作selectButton:目標類的NSApplication

它也顯示一個錯誤,NSApplication不符合關鍵值符合保持對我的數組的引用的插座。數組控制器,窗口和按鈕不綁定到NSApplication,而是綁定到新的窗口控制器。我會預料到,如果有任何問題,就不會提到NSApplication,而是控制器綁定到的窗口控制器。

任何人都知道這裏發生了什麼?這是一個Target-Action問題,因爲我將「主要NIB文件庫名稱」從「主菜單」更改爲「選擇」?如果我不應該改變這個,那麼我怎麼才能讓Cocoa在顯示文檔窗口之前顯示選擇屏幕?

任何幫助,非常感謝。 Rob

回答

9

IB中文件所有者的類的設置只是建議性的;它讓IB只顯示由該類的實例提供的出口和動作。它並不強制文件的所有者將是該類的一個實例,因爲文件的所有者不是該筆尖的一部分。

文件的所有者是加載筆尖的對象。 這一定意味着它位於筆尖之外,筆尖中沒有任何東西可以確定它的任何內容。對於MainMenu nib,其文件所有者 - 加載MainMenu nib的對象 - 是NSApplication實例。因此,即使您告訴IB它不會是應用程序,您連接到MainMenu筆尖的文件所有者的所有內容都會與應用程序對象連接。

應用程序是MainMenu筆尖的所有者 - 不管你告訴IB什麼 - 不是錯誤。該應用程序是總是 MainMenu筆尖的所有者。這是正常的和正確的;你不能改變它,不應該試圖改變它,也不需要改變它。

簡而言之,這個錯誤在於你使用一個筆尖來達到兩個截然不同的目的。

您應該讓MainMenu nib獨立 - 僅包含MainMenu,您的自定義文檔控制器(我將在一會兒討論)以及您的應用程序委託 - 並將前一個文檔窗口移到單獨的窗口中筆尖,由前文件窗口控制器擁有。爲了讓窗口控制器成爲這個筆尖的所有者,您需要讓窗口控制器加載它。你必須在代碼中這樣做 - 你不能在IB或plist中設置它。

在您的應用程序的委託中,實例化並擁有窗口控制器。這聽起來像你做了一個自定義的NSWindowController子類,所以你可以覆蓋它的init,讓它自己發送initWithWindowNibName:消息來加載並擁有該筆尖。然後,只需使用allocinit從應用程序委託創建窗口控制器。

這將擺脫控制檯消息,並確保按鈕實際上連接到窗口控制器(因爲他們連接到文件的所有者,其中,這一變化,將是窗口控制器) 。

讓您的應用程序代理通過發送窗口控制器showWindow:消息來響應applicationOpenUntitledFile:。這將使用戶通常會創建新文檔的任何時候出現前一個文檔窗口。

如果您要支持創建文檔(即允許新文檔工作)的常用方法,請執行applicationDidFinishLaunching:applicationShouldHandleReopen:hasVisibleWindows:而不是applicationOpenUntitledFile:。確保沒有文件是開放的,並顯示你的窗口,如果是這樣的話。

您還應該NSDocumentController的自定義子類,讓您的文檔控制者的一個實例,並在類中,實現addDocument:removeDocument:重新顯示先前的文檔窗口,當最後一個打開的文檔被關閉,在文檔打開時將其隱藏起來。

+0

這幫了很大忙。一些讓我失望的是使用核心數據的文檔應用程序不會自動創建應用程序委託。一旦我創建了委託,我就可以停止自動創建,然後打開我的初始窗口。非常感謝! – Rob 2010-10-13 22:16:47

相關問題