无法使用MainMenu.xib中的菜单访问实例变量

时间:2013-08-24 20:15:00

标签: cocoa menu first-responder

由于某些原因,在MainMenu.xib中使用菜单项时,我一直得到空值。我想我理解First Responder和响应者链(也许),我的菜单正在解雇我希望它们在各种控制器中触发的方法。不幸的是,从菜单调用时,控制器中的实例变量始终为null。但是当按钮调用相同的方法时,实例变量的值是预期的。我确保在使用菜单之前控制器及其实例变量是alloc / inited,它们是。我可以使用按钮触发方法并观察它是否有效,然后在同一个运行时使用菜单激活它并观察它是否为空。显然我遗漏了一些关于菜单的重要内容。

这是基本设置:

@interface ImportController : NSObject {  // ImportController owns Import.xib

    NSMutableArray *importArray;

}

- (IBAction)methodThatUsesArray:(id)sender;

@property (nonatomic, retain) NSMutableArray *importArray;




@implementation ImportController

- (void)awakeFromNib {

    // Code that opens the Import window owned by ImportController.
    // Code that initializes and populates importArray.           

}

- (IBAction)methodThatUsesArray:(id)sender {

    NSLog(@"%@", importArray); 

    /* When this method is invoked by an NSButton in the Import.xib, 
the NSLog statement reveals a fully populated importArray. But when the 
method is invoked by a menu item from the MainMenu, it logs (null). 
I have tried adding methodThatUsesArray to the FirstResponder object 
in the MainMenu and linking the MainMenu menu item directly to the 
ImportController object. I also have tried accessing importArray from 
other controllers using accessor methods. The only way I can get to 
the contents of importArray is to use a button in the 
Import.xib. */

}

@synthesize importArray;

更新:这一点越来越清晰。 Import.xib由两个控制器使用:一个名为ImportWindowController的NSWindowController实例和一个名为ImportController的NSObject实例。当用户单击MainMenu.xib中的工具栏按钮时,ImportWindowController不会打开窗口,但ImportController包含导入窗口使用的所有插座和方法。

当程序首次启动时,某些东西(NSApplication?)初始化了ImportController的第一个副本。但是,在我按下MainMenu.xib中的工具栏按钮之前,窗口才会出现。那是当ImportWindowController初始化ImportController的第二个副本时(通过记录“self”我发现它们有不同的地址)。当我使用Import.xib中的按钮调用ImportController方法时,它是填充数组并按预期运行的第二个副本。但是当我使用主菜单项时,它是第一个被调用的副本,并返回数组的空值,什么也不做。显然,这里存在一个重大的设计问题,但我仍然在考虑最好的前进方式。

另一个更新:如果我从IB中的MainMenu.xib中删除了ImportController蓝色立方体,那么我解决了启动两个ImportController实例的问题。但是我的菜单项目显示为灰色。 ImportController不在响应者链中?

0 个答案:

没有答案