从其他类访问IBOutlet

时间:2010-11-07 23:10:54

标签: cocoa document iboutlet

我有一个基于文档的cocoa应用程序,应用程序菜单中的项目连接到IBAction。单击该项需要执行在主nib文件中使用IBOutlet的任务,该文件正在使用另一个类MyDocument。创建同一个类的2个对象,每个笔尖中的一个似乎不起作用。我怎样才能进入插座?

3 个答案:

答案 0 :(得分:3)

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

听起来这个动作适用于当前文档,然后它应该由文档实现。在这种情况下,让菜单将其动作发送给第一个响应者,然后将动作方法放在MyDocument类中。

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

阅读RespondersCocoa Event-Handling Guide部分了解详情。

答案 1 :(得分:1)

总结以上内容,在您的NIB / XIB文件中,在界面构建器中建立与First Responder对象的连接,而不是文件所有者或其他任何内容。您仍然可以向潜在的第一响应者提供一系列行动。

然后Cocoa接受该选择器并查找它,从当前第一个响应者的NSView(如果有的话)开始,然后使用当前正在使用的NSDocument,然后使用它的窗口控制器等等一直到应用程序代表。它检查的第一个实际实现该方法的对象,它将使用该对象(在用同一个对象验证它之后)。

所以:

@interface MyDocumentTypeA : NSDocument {
}

-(void)myMenuAction:(id)sender;

-

@interface MyDocumntTypeB : NSDocument {
}

// -myMenuAction: not implemented here

-

@interface MyApplicationDelegate ... {
}

-(void)myMenuAction:(id)sender;

-

在“界面”构建器中(甚至以编程方式),如果您已将菜单项的“操作”链接到第一响应者上名为“myMenuAction:”的选择器(等同于以编程方式完成时未指定目标),对于上述两个文档子类,将发生以下情况。

对于MyDocumentTypeA,当用户选择该菜单项时,将调用MyDocumentTypeA的-myMenuAction :.由于MyDocumentTypeB没有实现这个动作,Cocoa将继续查找响应者链,直到它到达你的应用程序委托,它实现了它,所以它将在这里被调用。

如果Cocoa在响应者链中找不到实现该方法的对象,则菜单项将保持禁用状态。

答案 2 :(得分:0)

有一种方法可以做到这一点,我已经在类似的帖子中发布了答案:Access IBOutlet from other class (ObjC)