【问题标题】:(Cocoa Mac) NSWindowController showWindow allocates/initializes a new NSWindowController?(Cocoa Mac) NSWindowController showWindow 分配/初始化一个新的 NSWindowController?
【发布时间】:2013-10-07 23:12:35
【问题描述】:

我有一个扩展 NSWindowController 的类 BrowserWindowController。我的应用程序委托有一个 BrowserWindowController,它在应用程序启动时分配、初始化和指向一个实例变量。然后,它显示它的窗口。目标是显示一个来自 NIB 的窗口。

但是,我使用的代码最终分配了两个 BrowserWindowController 并初始化了两者。当 BWC 的 initWithWindow 方法被调用时,我已经使用调试器进行了跟踪:

browser = [[BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"]; //this calls initWithWindow as expected
[browser showWindow:nil]; //this allocates ANOTHER BWC and calls initWithWindow on it!

showWindow 正在制作一个新的 BrowserWindowController。我不知道它指向的新对象是什么。这对我来说是个大问题。有什么办法可以解决这个问题或使用不同的方法使窗口显示?或者我至少可以得到一个指向 showWindow 出于某种原因创建的控制器的指针吗?

【问题讨论】:

  • 你知道,当我调用showWindow时,它会经历很多内置的nib加载方法调用。也许在我的 xib 文件的某个地方我必须改变一些东西?
  • 所以我在 Instruments 中进行了测试,它说额外的 BrowserWindowController 分配的负责库是 AppKit。
  • 还有一件事,你为什么在这里使用 nil,尽管使用了 self??
  • @hussainShabbir 你的意思是在 showWindow 参数中?我以为没关系。无论如何,我尝试将 self 放入,但它并没有解决问题。我的应用委托实际上与窗口没有任何连接,只是我希望委托制作一个窗口控制器并在应用启动时打开该窗口。
  • 您是否碰巧在多个 nib 文件中将应用程序委托作为 xib 顶级对象(蓝色立方体)?

标签: objective-c macos cocoa showwindow


【解决方案1】:

你检查过这样的条件并尝试了吗?

if !(browser)
{
browser = [[BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"]; //this calls initWithWindow as expected
[browser showWindow:nil];
}

【讨论】:

  • 我刚才试了一下,if条件满足。在我的示例代码的第一行之前,它肯定是未分配的。
【解决方案2】:

有史以来最糟糕的解决方案。问题是我的控制器中有一个名为“owner”的属性,它是一个 NSString。 NSWindowController 已经有一个“所有者”属性,我忽略了它。不知何故,这导致 NIB 加载器创建了第二个没有可访问指针的控制器,并做了一些其他奇怪的事情。

所以我重命名了它,它现在可以工作了。谢天谢地……我被这个问题吓坏了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多