2010-11-07 104 views
2

我有一個基於文檔的可可應用程序,其中應用程序菜單中的項目與IBAction連接。單擊該項目需要執行一項任務,該任務在使用另一個類MyDocument的主筆尖文件中使用IBOutlet。創建兩個同一類的對象,每個筆尖都有一個似乎不起作用。我怎樣才能訪問插座?從其他類訪問IBOutlet

+0

你需要澄清一下鉤住什麼。從您的描述中不清楚。 – 2010-11-07 23:50:19

回答

3

菜單項的操作通常會發送給第一個響應者,以便當前選擇的任何操作都可以對其執行操作。

聽起來像這個動作是對當前文檔有效的東西,那麼它應該由文檔來實現。在這種情況下,將菜單發送給第一響應者,然後將操作方法​​放入MyDocument類中。

如果您嘗試發送的操作是自定義操作:在主菜單筆尖中選擇First Responder項目,添加您的方法名稱,然後將菜單項的選擇器連接到操作。

閱讀Cocoa Event-Handling GuideResponders部分了解更多信息。

+0

非常感謝,它非常完美! – nosedive25 2010-11-10 00:42:47

1

總結上述內容,在您的NIB/XIB文件中,在界面構建器中建立與First Responder對象的連接,而不是文件所有者或其他任何東西。你仍然可以在潛在的第一響應者身上接受一系列的行動。然後

可可需要的是選擇和多達查找它,開始用的NSView(如果有的話),這是目前國內第一反應,然後用NSDocument這是當前使用的,那麼它的窗口控制器等等等等一路到應用程序委託。它檢查的第一個對象實際上實現了該方法,它將使用該對象(在用同一對象驗證它之後)。

所以:

@interface MyDocumentTypeA : NSDocument { 
} 

-(void)myMenuAction:(id)sender; 

-

@interface MyDocumntTypeB : NSDocument { 
} 

// -myMenuAction: not implemented here 

-

@interface MyApplicationDelegate ... { 
} 

-(void)myMenuAction:(id)sender; 

-

在Interface Builder(甚至在程序上),如果您已經鏈接了「行動「的菜單項到a在First Responder上選擇名爲「myMenuAction:」的選擇器(等同於以編程方式完成時未指定目標),對於上述兩個文檔子類,將發生以下情況。

對於MyDocumentTypeA,當用戶選擇該菜單項時,MyDocumentTypeA的-myMenuAction:將被調用。由於MyDocumentTypeB沒有實現這個動作,Cocoa將繼續查找響應者鏈,直到它到達你的應用程序委託,該應用程序委託實現它,所以它將在這裏調用。

如果Cocoa在執行該方法的響應者鏈中未找到對象,則菜單項保持禁用狀態。

+0

你如何與First Responder對象建立連接? – Shamoon 2012-08-23 14:27:00