我有一个基于文档的cocoa应用程序,应用程序菜单中的项目连接到IBAction
。单击该项需要执行在主nib文件中使用IBOutlet
的任务,该文件正在使用另一个类MyDocument
。创建同一个类的2个对象,每个笔尖中的一个似乎不起作用。我怎样才能进入插座?
答案 0 :(得分:3)
菜单项的操作通常会发送给第一个响应者,以便当前选择的任何内容都可以对其进行操作。
听起来这个动作适用于当前文档,然后它应该由文档实现。在这种情况下,让菜单将其动作发送给第一个响应者,然后将动作方法放在MyDocument类中。
如果您尝试发送的操作是自定义操作:在主菜单笔尖中选择First Responder项,添加方法名称,然后将菜单项的选择器连接到操作。
阅读Responders的Cocoa 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)