Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何使用Interface Builder在Cocoa应用程序中管理多个窗口_Xcode_Cocoa_Window_Nswindow - Fatal编程技术网

Xcode 如何使用Interface Builder在Cocoa应用程序中管理多个窗口

Xcode 如何使用Interface Builder在Cocoa应用程序中管理多个窗口,xcode,cocoa,window,nswindow,Xcode,Cocoa,Window,Nswindow,我有3个类的应用程序:AppController、Profile、ProfileBuilder。我还需要3个窗口:每个类一个。我尝试将所有3个都保留为NSObject的子类,并将initWithNibName应用于NSWindowController类WindowController变量,但当我尝试在每个窗口上输出一些值时,它将不起作用,并且使用NSLog将窗口结果设为null。我想知道管理多个窗口的最佳方法是什么,可能所有窗口都来自同一个类,比如AppWindowsController,在其他

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

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

-(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文件中,我将文件的所有者设置为Profile。

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

您不需要迭代数组来查找
NSWindow
类。 如果将profileWindow定义为插座并在IB中连接它,则调用

[[NSBundle mainBundle] loadNibNamed:@"ProfileWindow" owner:self topLevelObjects:&array];
将窗口对象分配给您的插座,不需要数组内容。
这里的关键是作为接口的所有者对象。在IB中,您可以定义所有者的类类型,如果是,请查看其outlets。

我不明白数组是如何工作的。。为什么不需要初始化它?为什么它已经包含对象?方法loadNibNamed:owner:topLevelObjects:通过引用返回数组。当通过引用返回某个内容时,您将地址提供给方法中的对象(“&array”)。在所有通过引用返回错误的方法中也可以看到这一点。我不需要初始化它,因为该方法提供了数组,您只需要给它一个变量来指向它。它告诉我:[NSBundle loadNibNamed:owner:topLevelObjects:]:发送到实例0x10011DA70的无法识别的选择器再次查看我的代码--消息需要发送到[NSBundle mainBundle]。事实上,如果你这样做,它甚至不应该编译,所以我不确定你做错了什么。你为什么不发布你现在使用的代码。好吧,也许我知道它为什么不起作用了。。我调用init函数(在分配了它的一个实例之后)从AppController类中评测。此类与ProfileBuilder的目录相同,MainMenu.xib也是如此。我在想,问题可能是这个包中有不止一个nib文件..哇。你刚才在最后一段向我解释了这么多。非常感谢。我一直在四处寻找关于主nib、文件所有者和次nib(加上文件所有者)之间的关系的信息,这让我非常抓狂。我想我现在模糊地理解了文件所有者在次nib文件中的重要性。在某些方面,这对我来说仍然是一种魔力,但这无疑有助于推动我的理解