【问题标题】:Programmatically creating new windows and accessing window objects in Cocoa以编程方式创建新窗口和访问 Cocoa 中的窗口对象
【发布时间】:2010-05-29 21:30:18
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: objective-c windows cocoa xcode


    【解决方案1】:

    第一个问题是您重复加载MainMenu NIB/XIB。那会做非常糟糕的事情——MainMenu 应该只在应用程序启动时加载一次。

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

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

    【讨论】:

    • 好的,只是为了确保我对您的理解正确.. 在我的 MainMenu NIB 中,我应该只有我的主启动代码和一次性启动元素,并且在另一个 NIB 位置我将复制的 GUI 对象。假设这是正确的:P 我浏览了该页面并注意到我需要为 NIB 的文件所有者创建出口。我以前建立过连接,但我更喜欢以编程方式动态创建窗口。我需要存储对这些对象的引用,但是通过代码创建这些出口而不是相互拖动连接有什么不同?
    • 基本上,是的。主菜单的主菜单,其他东西的辅助 nib 文件。几乎从不需要以编程方式创建窗口(这是浪费时间并且购买 IB 已经无法做到的任何东西)——但是如果您正在加载一个 NIB,那么无论如何您都不会以编程方式创建一个窗口。没有“通过代码创建网点”;无论如何,nib 文件只不过是对象的存档。如果您在代码中创建 UI,您只是通过各种类提供的 API 复制存档中的内容。
    • 我发现这篇文章对理解你的意思很有帮助。 stackoverflow.com/questions/598082/… 非常感谢您的帮助并为我指明了正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多