【问题标题】:How to manage multiple windows in Cocoa apps with Interface Builder如何使用 Interface Builder 在 Cocoa 应用程序中管理多个窗口
【发布时间】:2012-09-19 17:02:03
【问题描述】:

我有这个应用程序有 3 个类:AppController、Profile、ProfileBuilder。我还需要 3 个窗口:每个班级一个。我尝试将所有 3 个作为 NSObject 的子类并将 initWithNibName 应用于 NSWindowController 类 WindowController 变量,但是当我尝试在每个窗口上输出一些值时它不起作用,并且窗口使用 NSLog 导致为空。我想知道管理多个窗口的最佳方法是什么,可能所有窗口都来自同一个类,如 AppWindowsController,在其他类中涉及尽可能少的特定代码,并尽可能将其他类保留为 NSObject 而不是 NSWindowController 的子类.因此,如果有的话,也许有一种方法可以远程控制窗口的行为,在特定类中添加尽可能少的代码,只是为了让它们尽可能清晰并独特地关注它们的内容。谢谢,希望我说清楚了,我实际上是 Cocoa 框架的新手。

【问题讨论】:

    标签: xcode cocoa window nswindow


    【解决方案1】:

    您应该能够在您的窗口中为您的不同类以 init 方法加载 nib 文件。例如,在 Profile 中,您可以执行以下操作:

    -(id)init {
        if (self = [super init]) {
            NSArray *array;
            BOOL success = [[NSBundle mainBundle] loadNibNamed:@"ProfileWindow" owner: self topLevelObjects:&array];
            if (success) {
                for (id obj in array) {
                    if ([obj isKindOfClass:[NSWindow class]]) {
                        self.profileWindow = obj;
                    }
                }
                [self.profileWindow makeKeyAndOrderFront:self];
            }
        }
        return self;
    }
    

    profileWindow 是一个属性(类型为 strong)。在 xib 文件中,我将 File's Owner 设置为 Profile。

    【讨论】:

    • 我不明白数组是怎么工作的。。你怎么不需要初始化它,为什么它已经包含对象了?
    • 方法 loadNibNamed:owner:topLevelObjects: 通过引用返回数组。当通过引用返回某些内容时,您将地址提供给方法中的对象(“&array”)。您也可以在所有通过引用返回错误的方法中看到这一点。我不需要初始化它,因为该方法提供了数组,你只需要给它一个变量来指向它。
    • 它告诉我:[NSBundle loadNibNamed:owner:topLevelObjects:]: unrecognized selector sent to instance 0x10011da70
    • 再看我的代码——消息需要发送到[NSBundle mainBundle]。实际上,如果你这样做,它甚至不应该编译,所以我不确定你做错了什么。你为什么不发布你现在使用的代码。
    • 好吧,也许我知道它为什么不起作用。我从 AppController 类调用 init 函数到 Profile(在分配它的实例之后)。该类与 ProfileBuilder 位于同一目录中,MainMenu.xib 也是如此。我在想问题可能是该捆绑包中有多个 nib 文件..
    【解决方案2】:

    我只是想改进一下rdelmar的解决方案。

    您无需遍历数组即可找到NSWindow 类。 如果将profileWindow定义为outlet并在IB中连接,调用

    [[NSBundle mainBundle] loadNibNamed:@"ProfileWindow" owner:self topLevelObjects:&array];
    

    会将窗口对象分配给您的插座,不需要数组内容。 这里的关键是充当接口的所有者对象。在 IB 中,您可以定义所有者的类类型,如果是,请查看其出口。

    【讨论】:

    • 哇。你刚刚在最后一段中向我解释了这么多。非常感谢。我一直在寻找有关主笔尖、文件所有者和辅助笔尖(加上文件所有者)之间关系的信息,这让我非常抓狂我想我现在模糊地掌握了文件所有者对辅助笔尖文件的重要性。在某些方面,这对我来说仍然是一种魔法,但这绝对有助于推动我的理解。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 2010-11-18
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多