Macos 覆盖窗口关闭按钮

Macos 覆盖窗口关闭按钮,macos,nswindow,osx-lion,popover,Macos,Nswindow,Osx Lion,Popover,我正在为OSX开发一个应用程序,其中我使用了一个自定义窗口来绘制图像作为背景,包括标题栏。我一直在修改以绘制窗口,然后调用[NSWindow standardWindowButton:forStyleMask:]以获得标准的关闭、最小化和最大化按钮 问题是,我的应用程序使用NSPOVERS,当我在打开popover时关闭或最小化应用程序时,它将关闭popover或显示popover最小化的动画,而不是关闭应用程序。是否有方法覆盖NSWindow中的默认关闭/最小化行为,以便我可以先关闭任何打开的

我正在为OSX开发一个应用程序,其中我使用了一个自定义窗口来绘制图像作为背景,包括标题栏。我一直在修改以绘制窗口,然后调用[NSWindow standardWindowButton:forStyleMask:]以获得标准的关闭、最小化和最大化按钮

问题是,我的应用程序使用NSPOVERS,当我在打开popover时关闭或最小化应用程序时,它将关闭popover或显示popover最小化的动画,而不是关闭应用程序。是否有方法覆盖NSWindow中的默认关闭/最小化行为,以便我可以先关闭任何打开的弹出窗口

谢谢,如果这是一个明显的问题,请原谅——这是我第一次使用OSXSDK,所以我没有太多经验

编辑:在我发布这篇文章几小时后,我认为我有了一个明显的解决方案——使用NSWindowDelegate方法“windowWillClose:”和“WindowWillMinimize:”并关闭那里的弹出窗口。但是,由于关闭/最小化按钮正在关闭popover,因此如果popover打开,则不会调用这些委托方法。这让我回到了步骤1,但希望了解这些行为将有助于某人解决问题

NSPOVERS还有另一个问题,我不知道它是否连接,所以我想我会在这里添加它,以防有共同的原因。有时,当我试图关闭一个popover时,会出现以下错误(在上下文中,我按下一个NSButton,调用一个函数来检查popover是否存在,如果存在,则关闭它):


结果证明,解决方案相当简单

在NSN窗口上创建按钮时,我更改了按钮的操作和目标:

[closeButton setTarget:self.delegate]; // alternatively you can make it self.windowController
[closeButton setAction:@selector(closeThisWindow:)]; 
然后在NSWindowController子类中,我实现了以下方法:

-(void)closeThisWindow {
    [self close]; // for the minimize button you'll call [self.window miniaturize]
}

由于某些原因,当窗口重新打开或未缩小时,NSPOVERS总是重新出现;因为我实际上希望在我的应用程序中出现这种行为,所以这不是问题,但如果使用此解决方案,需要记住这一点。如果您没有任何子窗口,那么您可以只遍历
self.window.childWindows
,因为nspover被视为子窗口。如果要单独处理其他子窗口,可以在NSWindow子类中添加一个数组,该子类监视所有的弹出窗口,并对其进行迭代。

但是…堆栈跟踪呢?!我需要知道。@Big OClaire不幸的是,这个问题已经快6岁了,我实际上已经无法访问源代码了,所以我帮不了你。对不起@Big OClaire:异常可能是重写
NSWindow.contentView
-(void)closeThisWindow {
    [self close]; // for the minimize button you'll call [self.window miniaturize]
}