首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSApplication windows属性-窗口未移除?

NSApplication windows属性-窗口未移除?
EN

Stack Overflow用户
提问于 2013-01-17 19:40:25
回答 3查看 2.6K关注 0票数 3

我有一个NSWindow/控制器,我显示模式。它有一个“关闭”按钮,连接到这样的动作:

代码语言:javascript
复制
- (IBAction)close:(id)sender
{
    [self.window orderOut:sender];
    [self.window close];

    [[NSApplication sharedApplication] stopModal];
}

在我的主窗口,我展示了模式:

代码语言:javascript
复制
- (IBAction)modal:(id)sender
{
    NSLog(@"Before: %lu", [[[NSApplication sharedApplication] windows] count]);

    ModalWindowController *modal = [[ModalWindowController alloc] initWithWindowNibName:@"ModalWindowController"];
    [[NSApplication sharedApplication] runModalForWindow:modal.window];

    NSLog(@"After: %lu", [[[NSApplication sharedApplication] windows] count]);
}

我打开和关闭模式几次,输出如下:

代码语言:javascript
复制
2013-01-17 14:36:08.071 Modals[3666:303] Before: 1
2013-01-17 14:36:08.962 Modals[3666:303] After: 2
2013-01-17 14:36:09.578 Modals[3666:303] Before: 2
2013-01-17 14:36:11.009 Modals[3666:303] After: 3
2013-01-17 14:36:12.108 Modals[3666:303] Before: 3
2013-01-17 14:36:12.910 Modals[3666:303] After: 4

因此,[[NSApplication sharedApplication windows]计数]只会不断增加。

我希望当我打开和关闭模态窗口时,它会增加和减少。我的应用程序使用ARC。有人能给我解释一下吗?

提前谢谢你

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-17 19:54:35

您正在关闭您的窗口,但这并不是解除它,因为您的窗口控制器ModalWindowController仍然保留它。我在您的示例中没有看到任何指示窗口控制器正在释放的东西。

提供给您的最简单的答案是在调用-runModalForWindow:之后让您释放窗口控制器。

您可能期望的是窗口控制器在窗口关闭时关闭。这是你自己必须要做的事。来自苹果文档中的“关闭窗口行为”:

如果希望关闭窗口使窗口和窗口控制器在不属于文档的情况下消失,则NSWindowController的子类可以观察NSWindowWillCloseNotification,或者作为窗口委托实现windowWillClose:方法,并在实现中包含以下代码行:“自自动释放;”

在您的场景中,这可能不是最好的方法,因为在您有机会调用-stopModal之前,您将同时处理窗口控制器和窗口。

票数 4
EN

Stack Overflow用户

发布于 2013-01-17 19:56:44

看看这个NSWindow方法:

代码语言:javascript
复制
- (void)setReleasedWhenClosed:(BOOL)releasedWhenClosed;

如果您将其设置为“是”,则关闭时将释放您的窗口。但是要小心,当计数为零时,它将被取消分配。

票数 2
EN

Stack Overflow用户

发布于 2019-06-11 15:44:43

对于斯威夫特5人来说,这对我来说是可行的。在这种情况下,我想正确地关闭每一个窗口,除非它是最后一个窗口,在这种情况下,我希望它隐藏

代码语言:javascript
复制
  func windowShouldClose(_ sender: NSWindow) -> Bool {
    sender.isReleasedWhenClosed = true
    if NSApp.windows.count > 1 {
        return true
    }
    NSApp.hide(nil)
    return false
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14386802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档