NSWindowController showWindow: 闪烁窗口

Posted

技术标签:

【中文标题】NSWindowController showWindow: 闪烁窗口【英文标题】:NSWindowController showWindow: flashes the window 【发布时间】:2012-11-29 03:32:19 【问题描述】:

所以我试图像这样打开一个新的 NSWindow:

NSWindowController *winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"];
[winCon showWindow:self];

当我这样做时,新窗口会在屏幕上闪烁,就像它出现然后很快消失一样。我知道我在 IB 和所有内容中都正确引用了我的窗口。就像它想显示窗口一样,但随后它几乎立即被释放或发生了一些奇怪的事情。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

首先,初始化器的名称不是-initWithNibName:,而是-initWithWindowNibName:

其次,如果您使用的是 ARC,这是正确的,您的窗口会变小,因为您没有对 NSWindowController 实例的强引用。当方法结束时,您的引用也会结束。

例如,如果您要在应用程序委托界面中执行此操作:

@property(strong) NSWindowController *winCon;

并在你的实现文件中合成它:

@synthesize winCon;

那么你可以这样设置:

self.winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"];
[self.winCon showWindow:self];

现在您的窗口不会消失。当应用程序关闭时,窗口控制器将被释放。

【讨论】:

效果很好!我认为它与类似的东西有关,但我不知道如何解决它。非常感谢。 可能是我听过的最好的解释之一。很好的例子,当你不引用你的变量时,ARC是如何工作的......谢谢! 如果你想打开多个窗口,你可以将单独的 NSWindowController 实例添加到 NSMutableArray,它应该首先声明为你的应用委托的属性。不要忘记先实例化数组(就像我一样),使用 alloc-init 或 new。 稍作修改,我还可以将引用保存在全局静态 NSMutableArray* WindowList 中。当您打开同一个窗口的多个实例时,这似乎有效,但是当我将 NSMutableArray* WindowList 设为静态成员(可可中的“类变量”)(我的 WindowDelegate 类)时,为什么这不起作用?它应该还在记忆中。一个更紧迫的问题。当用户关闭窗口时。如何确保内存已清除?因为我仍然持有对窗口的引用。不知何故,垃圾收集真的很痛苦。 NSMutableDictionary 对于窗口少的小应用可能是个不错的选择,推荐体验更好

以上是关于NSWindowController showWindow: 闪烁窗口的主要内容,如果未能解决你的问题,请参考以下文章

NSWindowController showWindow: 闪烁窗口

来自 NSWindowController Cocoa 的自定义视图

NSManagedObjectContext 传递给 NSWindowController 变为 nil

Interface builder中的NSWindowController对象链接

如何使用 xib 文件正确实现 NSWindowController 子类

Swift 中的 NSWindowController。使用 Nib 进行子类化和初始化