从其他类访问IBOutlet

问题描述:

我有一个基于文档的可可应用程序,其中应用程序菜单中的项目与IBAction连接。单击该项目需要执行一项任务,该任务在使用另一个类MyDocument的主笔尖文件中使用IBOutlet。创建两个同一类的对象,每个笔尖都有一个似乎不起作用。我怎样才能访问插座?从其他类访问IBOutlet

+0

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

菜单项的操作通常会发送给第一个响应者,以便当前选择的任何操作都可以对其执行操作。

听起来像这个动作是对当前文档有效的东西,那么它应该由文档来实现。在这种情况下,将菜单发送给第一响应者,然后将操作方法​​放入MyDocument类中。

如果您尝试发送的操作是自定义操作:在主菜单笔尖中选择First Responder项目,添加您的方法名称,然后将菜单项的选择器连接到操作。

阅读Cocoa Event-Handling GuideResponders部分了解更多信息。

+0

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

总结上述内容,在您的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

有一种方法如何做到这一点,我已经张贴的答案类似的线程:Access IBOutlet from other class (ObjC)