窗口关闭时停止模式(可可)

Posted

技术标签:

【中文标题】窗口关闭时停止模式(可可)【英文标题】:Stopping modal when window is closed (Cocoa) 【发布时间】:2010-01-05 23:15:41 【问题描述】:

我目前正在使用此代码显示模式窗口:

[[NSApplication sharedApplication] runModalForWindow:mainWindow];

但是,当我关闭此窗口时,其他窗口仍处于非活动状态。使用“red x”关闭窗口时如何运行stopModal方法?

谢谢,

迈克尔

【问题讨论】:

【参考方案1】:

您可以为窗口创建一个委托并让它响应 -(void)windowWillClose:(NSNotification *)notification- (void )windowShouldClose:(NSNotification *)notification 方法如下:

- (void)windowWillClose:(NSNotification *)notification 
   [[NSApplication sharedApplication] stopModal];

见Mac Dev Center: NSWindowDelegate Protocol Reference

【讨论】:

【参考方案2】:

如果您有一个应用于特定窗口的对话框,那么您可能不应该使用模态对话框,而是使用工作表。如果可能,应避免使用模态对话框。如果您使用工作表,那么您遇到的问题将不再是问题。

- (void)showSheet:(id)sender

    [NSApp beginSheet:yourModalWindow 
        modalForWindow:windowThatSheetIsAttachedTo
        modalDelegate:self
        didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
           contextInfo:nil];


- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo

    [sheet orderOut:self];
    [NSApp endSheet:sheet];

【讨论】:

【参考方案3】:

除了 Randall 的回答,您还可以将控制器类链接为 .xib 文件中定义的窗口的委托。

你可以处理

[[NSApplication sharedApplication] stopModal];

在任一

-(void)performClose:(id)sender

-(void)windowWillClose:(NSNotification *)notification

方法。

【讨论】:

【参考方案4】:

Swift 4(注意之前的方法已弃用):

window.beginSheet(self.uiSettingsPanel, completionHandler: response in
        NSLog("Finished sheet, response: \(response)")
)

其中 self.uiSettingsPanel 是 NSPanel 子类的实例。然后,在工作表的 NSPanel 子类中,用类似的东西关闭它

@IBAction func buttonOK(_ sender: NSButton) 
    self.sheetParent!.endSheet(self, returnCode: .OK)

【讨论】:

以上是关于窗口关闭时停止模式(可可)的主要内容,如果未能解决你的问题,请参考以下文章

QVideoWidget 独立。窗口关闭时如何停止视频?

取消 QFileDialog 时如何停止子窗口关闭

离子应用程序在弹出框和模式关闭后冻结或停止工作

弹出窗口关闭时停止 youtube 视频 [重复]

关闭模式时如何停止 $interval ($uibModal)

在关闭模式时停止视频?