我有一个基于文档的可可应用程序,应用程序菜单中的一个项目连接到IBAction
. 单击该项目需要执行一个任务,该任务IBOutlet
在使用另一个类的主 nib 文件中使用MyDocument
. 创建 2 个相同类的对象,每个 nib 中的一个对象似乎不起作用。如何访问插座?
3 回答
菜单项的操作通常会发送给第一响应者,以便当前选择的任何内容都可以对其进行操作。
听起来这个动作是对当前文档起作用的东西,那么它应该由文档实现。在这种情况下,让菜单将其操作发送给第一响应者,然后将操作方法放在 MyDocument 类中。
如果您尝试发送的操作是自定义操作:在主菜单 nib 中选择 First Responder 项,添加您的方法名称,然后将菜单项的选择器连接到操作。
阅读Cocoa 事件处理指南的响应者部分了解更多信息。
综上所述,在您的 NIB/XIB 文件中,在界面构建器中建立与 First Responder 对象的连接,而不是与文件所有者或其他任何东西的连接。您仍然会在潜在的第一响应者中获得一些行动。
Cocoa 然后获取该选择器并查找它,从当前作为第一响应者的 NSView(如果有)开始,然后是当前正在使用的 NSDocument,然后是窗口控制器等,一直到 Application 委托。它检查的第一个实际实现该方法的对象,它将使用该对象(在使用同一对象验证它之后)。
所以:
@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 在响应者链中找不到实现该方法的对象,则菜单项保持禁用状态。
有一种方法可以做到这一点,我已经在类似的线程中发布了答案:Access IBOutlet from other class (ObjC)