4

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

4

2 回答 2

6

您应该能够在不同类的 init 方法中使用 Windows 加载 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。

于 2012-09-28T04:04:25.250 回答
2

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

您无需遍历数组即可找到NSWindow该类。如果您将 profileWindow 定义为一个出口并在 IB 中连接它,则调用

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

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

于 2012-12-23T16:17:28.273 回答