2010-02-04 36 views
1

我的可可應用程序出現問題。我將我的應用程序委託用作控制器,並在NIB文件中打開一個窗口。點擊一個工具欄按鈕打開另一個NIB的另一個窗口。單擊保存在第二個窗口上的應用程序委託/控制器調用方法。所有這些工作正常。多窗口/ NIB可可應用程序的問題

奇怪的是,我不知道應用程序委託指向一個內存位置,當我點擊工具欄按鈕,並點擊保存在第二個窗口後不同的內存位置。就好像第二個應用程序委託/控制器正在創建,雖然單步執行代碼並沒有給我任何指示。

有沒有更好的方法來構建這種類型的應用程序?任何想法我要去哪裏錯了?

回答

2

這聽起來像您正在窗口的nib文件中創建AppController類的第二個實例。你不能這樣做,當一個筆尖在運行時被解除存檔時,nib文件中的每個對象實例都將被實例化。這意味着如果您在MainMenu.xib中有AppController實例並且還有一個MyWindow.xib文件,則AppController對象將被分配並初始化兩次。

通常情況下,您處理這個問題的方式是使用響應者鏈。在你的Window nib中,你指定First Responder作爲你的動作的目標。這意味着當調用動作方法時,如果通過調用-respondsToSelector:方法並傳入動作選擇器來響應該方法,則應用程序將詢問當前聚焦的視圖/控件(具有第一響應者狀態的視圖/控件)。

如果第一響應者不響應該方法,則消息沿響應者鏈傳播,直到找到響應該方法的對象。如果沒有對象響應該方法,則NSApplication實例會處理它並調用NSBeep()

就在方法發送到NSApplication實例之前,會詢問應用程序委託是否響應選擇。在這種情況下,如果AppController對象被設置爲應用程序委託,它將接收從窗口nib中的對象發出的作爲操作發送的消息。

如果這還不夠清晰,這是值得一讀的Event Handling guide

你不使用響應鏈。您可以通過調用[[NSApp delegate] yourMethod]來調用應用程序委託中的方法。

- (id)initWithAppController:(id)aController 
{ 
    self=[super initWithWindowNibName:@"YourWindowNibName"]; 
    if(self) 
    { 
     appController = [aController retain]; 
    } 
    return self; 
} 

你的窗口控制器可以調用的方法:您還可以通過將其作爲一個實例變量您NSWindowController對象加載筆尖,並在創建時設置它,像這樣存儲到應用程序控制器的引用你的AppController直接。

+0

事實上,這正是我正在做的。我會花一些時間閱讀推薦的指南;我不太清楚如何使用FirstResponder對象及其與我的代碼的連接。謝謝。 – Shawn

相關問題