Objective c 以编程方式创建新窗口并访问Cocoa中的窗口对象

Objective c 以编程方式创建新窗口并访问Cocoa中的窗口对象,objective-c,windows,cocoa,xcode,Objective C,Windows,Cocoa,Xcode,我在Cocoa中创建新窗口时遇到问题。 假设地说,假设我有WindowA,有一个叫做myButton的按钮。 单击myButton时,它会在以下类文件中运行此代码: -(void)openFile2:(id)sender { myNextWindow = [[TestWindowController alloc] initWithWindowNibName:@"MainMenu"]; NSString *testString = @"foo"; [myNextWind

我在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”没有关联


如何解决此问题?

第一个问题是重复加载主菜单NIB/XIB。这会造成非常糟糕的后果——主菜单应该只在应用程序启动时加载一次

您希望将任何需要重复加载到单独NIB/XIB文件中的UI分离出来,就像基于文档的应用程序具有main menu.XIB和document.XIB文件一样


要正确地做到这一点,您需要了解。请注意,窗口控制器也有重叠,如果您想使用它们,了解它们将很有帮助。

第一个问题是您重复加载主菜单NIB/XIB。这会造成非常糟糕的后果——主菜单应该只在应用程序启动时加载一次

您希望将任何需要重复加载到单独NIB/XIB文件中的UI分离出来,就像基于文档的应用程序具有main menu.XIB和document.XIB文件一样


要正确地做到这一点,您需要了解。请注意,窗口控制器也有重叠,如果您想使用它们,了解它们将很有帮助。

好的,只是为了确保我正确理解您的意思。。在我的主菜单NIB中,我应该只包含我的主启动代码和一次性启动元素,并且在另一个NIB中放置我将复制的GUI对象。假设这是正确的:P我浏览了那个页面,注意到我需要为文件所有者创建NIB的出口。我以前做过连接,但我更喜欢以编程方式动态创建窗口。我需要存储对这些对象的引用,但是通过代码创建这些出口而不是相互拖动连接有什么不同呢?基本上是的。主菜单用于主菜单,辅助nib文件用于其他内容。几乎不需要以编程方式创建窗口,这是浪费时间&没有IB不能做的事情,但是如果您正在加载NIB,那么无论如何也不会以编程方式创建它。没有通过代码创建门店;nib文件不过是对象的存档。如果你在代码中创建UI,你只是通过不同类上提供的API复制了存档中的内容。我发现这篇文章对理解你的意思非常有帮助。非常感谢你的帮助,并为我指明了正确的方向。。在我的主菜单NIB中,我应该只包含我的主启动代码和一次性启动元素,并且在另一个NIB中放置我将复制的GUI对象。假设这是正确的:P我浏览了那个页面,注意到我需要为文件所有者创建NIB的出口。我以前做过连接,但我更喜欢以编程方式动态创建窗口。我需要存储对这些对象的引用,但是通过代码创建这些出口而不是相互拖动连接有什么不同呢?基本上是的。主菜单用于主菜单,辅助nib文件用于其他内容。几乎不需要以编程方式创建窗口,这是浪费时间&没有IB不能做的事情,但是如果您正在加载NIB,那么无论如何也不会以编程方式创建它。没有通过代码创建门店;nib文件不过是对象的存档。如果你在代码中创建UI,你只是通过不同类上提供的API复制了存档中的内容。我发现这篇文章对理解你的意思非常有帮助。非常感谢您的帮助,并为我指明了正确的方向。