由于某些原因,在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不在响应者链中?