可可:以编程方式创建新窗口并访问窗口对象

Jef*_*ern 1 windows xcode cocoa objective-c

我在使用Cocoa创建新窗口时遇到问题.假设,假设我有"WindowA",并有一个名为"myButton"的按钮.当您单击"myButton"时,它会在以下类文件中运行此代码:

 -(void)openFile2:(id)sender
{
    myNextWindow = [[TestWindowController alloc] initWithWindowNibName:@"MainMenu"];
    NSString *testString = @"foo";

    [myNextWindow showWindow:self];
    [myNextWindow setButtonText:testString];
}
Run Code Online (Sandbox Code Playgroud)

简而言之,代码会复制"WindowA"并显示它.如您所见,此代码还运行一个名为'setButtonText'的方法,它是这样的:

- (void)setButtonText:(NSString *)passedText
{
    [myButton setTitle:passedText];
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我在本地调用此方法时,在原始窗口中 - 按钮文本更改(例如,[self setButtonText:testString])它可以工作.但是,它在新创建的窗口中不起作用(例如,[myNextWindow setButtonText:testString];)

当我逐步调试新创建的窗口时,它给出的'myButton'值是0x0.我是否必须手动将控制器/代理分配给新窗口?我认为代码中的'myButton'与新创建的窗口中的'myButton'没有关联.

我该如何解决这个问题?

bbu*_*bum 5

第一个问题是您MainMenu反复加载NIB/XIB.这将做非常糟糕的事情 - MainMenu应该只在应用程序启动时加载一次.

您希望将需要重复加载的任何UI分解为单独的NIB/XIB文件(与基于文档的应用程序具有MainMenu.xib和Document.xib文件的方式相同).

要正确执行此操作,您需要了解"文件所有者"概念以及如何正确利用它.请注意,窗口控制器也存在重叠,如果要使用它们,了解它们将会很有帮助.