【问题标题】:How to use NSWindowController to show a window in standard application?如何使用 NSWindowController 在标准应用程序中显示窗口?
【发布时间】:2012-09-19 07:14:16
【问题描述】:

我使用 Xcode 模板创建了一个新的空白标准应用程序。删除了 MainMenu.xib 中的窗口,我用 xib 创建了一个新的自定义 NSWindowController 子类。

它们被命名为“WYSunFlowerWindowController.h”和“WYSunFlowerWindowController.m”。

然后我附加如下初始化函数:

- (id)init
{
    NSLog(@"init()");

    return [super initWithWindowNibName:@"WYSunFlowerWindowController" owner:self];
}

我的 WYAppDelegate.m 文件如下所示:

static WYSunFlowerMainWindowController* windowController = nil;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    if (windowController == nil) {
        windowController = [[WYSunFlowerMainWindowController alloc] init];
    }
    [[windowController window] makeKeyAndOrderFront:windowController];
}

我遇到的问题是,在我启动应用程序后,窗口无法自行显示。谁能告诉我为什么?我的代码有什么问题吗?

我是 Objective-C 和可可的新手。所以我想我可能犯了一个我自己无法弄清楚的愚蠢错误。

更新:

这是我的项目源代码。请看看并帮助我弄清楚我的错误是什么。

https://dl.dropbox.com/u/3193707/SunFlower.zip

【问题讨论】:

  • 您是否启用了 ARC?我发现使用 ARC 时,窗口控制器会被释放,除非我将其设为 App Delegate 的属性(我确信还有其他方法可以做到这一点)。
  • 我正在使用 ARC。我将 windowController 作为 AppDelegate 类的静态字段。我认为在应用程序终止之前它不会被释放。

标签: objective-c xcode cocoa nib nswindowcontroller


【解决方案1】:

在您的 init 方法中,我认为您必须先将 self 设置为 super init,然后才能返回 self。

-(id)init
{
    NSLog (@"init()");
    self = [super initWithWindowNibName:@"WYSunFlowerWindowController" owners:self];
    return self;
}

编辑

尝试将makeKeyAndOrderFront: 替换为[windowController showWindow:self]

如果这仍然不起作用,请检查您的窗口控制器 xib,确保文件所有者设置为 WYSunFlowerWindowController 并且 IBOutlet 窗口(在 NSWindowController 中声明)已连接到窗口。

编辑 2:

在控制器中注释掉 @property 和 @synthesize 窗口是诀窍。不要重新声明已经在超类中预定义的 get 和 setter。

【讨论】:

  • 感谢您的帮助。我听从了你的指示,没有任何改变。还是不行。
  • 我已经完成了你提到的所有事情。不行。我不介意你可以下载我的项目源来看看吗? dl.dropbox.com/u/3193707/SunFlower.zip
  • 天哪,它有效!非常感谢。但是我很困惑为什么在子类中定义的窗口出口属性会导致这个问题?他们不能覆盖类父类的相同属性吗?
  • 问题不在于你重写了实例变量,而是你重写了getter/setter。 NSWindowController 可能会在您设置窗口 ivar 时对其执行某些操作,因此如果您覆盖它,为什么什么也没有显示。请记住不要重新声明 ivars,因为它什么都不做,并且可能存在潜在危险。
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多