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对象链接