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

时间:2010-05-29 21:30:19

标签: objective-c windows cocoa xcode

我在使用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'没有关联。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

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

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

要正确执行此操作,您需要了解concept of "File's Owner" and how to leverage it properly。请注意,窗口控制器也存在重叠,如果您想使用它们,了解它们将会很有帮助。