我在使用Cocoa创建新窗口时遇到问题。 假设,假设我有“WindowA”,并有一个名为“myButton”的按钮。 当您单击“myButton”时,它会在以下类文件中运行此代码:
-(void)openFile2:(id)sender
{
myNextWindow = [[TestWindowController alloc] initWithWindowNibName:@"MainMenu"];
NSString *testString = @"foo";
[myNextWindow showWindow:self];
[myNextWindow setButtonText:testString];
}
简而言之,代码会复制“WindowA”并显示它。如您所见,此代码还运行一个名为“setButtonText”的方法,即:
- (void)setButtonText:(NSString *)passedText
{
[myButton setTitle:passedText];
}
问题在于,当我在本地调用此方法时,在原始窗口中 - 按钮文本更改(例如,[self setButtonText:testString])它可以工作。但是,它在新创建的窗口中不起作用(例如,[myNextWindow setButtonText:testString];)
当我逐步调试新创建的窗口时,它给出的'myButton'值为0x0。我是否必须手动将控制器/代理分配给新窗口?我认为代码中的'myButton'与新创建的窗口中的'myButton'没有关联。
我该如何解决这个问题?
答案 0 :(得分:5)
第一个问题是您反复加载MainMenu
NIB / XIB。这将做非常糟糕的事情 - MainMenu
只应在应用程序启动时加载一次。
您希望将需要重复加载的任何UI分解为单独的NIB / XIB文件(与基于文档的应用程序具有MainMenu.xib和Document.xib文件的方式相同)。
要正确执行此操作,您需要了解concept of "File's Owner" and how to leverage it properly。请注意,窗口控制器也存在重叠,如果您想使用它们,了解它们将会很有帮助。