Stopping modal when window is closed (Cocoa)

有些话、适合烂在心里 提交于 2019-12-10 16:00:28

问题


I am currently displaying a modal window by using this code:

[[NSApplication sharedApplication] runModalForWindow:mainWindow];

However, when I close this window, the other windows are still inactive. How do I run the stopModal method when the window is closed using the "red x"?

Thank you,

Michael


回答1:


You can create a delegate for the window and have it respond to either the
-(void)windowWillClose:(NSNotification *)notification or the
- (void)windowShouldClose:(NSNotification *)notification methods like so:

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

See Mac Dev Center: NSWindowDelegate Protocol Reference




回答2:


If you have a dialog that applies to a specific window, then you probably shouldn't be using a modal dialog but a sheet. Modal dialogs should be avoided if possible. If you use a sheet then the problem that you're experiencing will no longer be an issue.

- (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:


Along with Randall's answer you can link the controller class as the delegate for the window defined in your .xib file.

You can handle the

[[NSApplication sharedApplication] stopModal];

in either

  • -(void)performClose:(id)sender

  • -(void)windowWillClose:(NSNotification *)notification

methods.




回答4:


Swift 4 (note that the previous methods are deprecated):

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

where self.uiSettingsPanel is the instance of the NSPanel subclass. Then, within the NSPanel sub-class for the sheet, close it with something like

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


来源:https://stackoverflow.com/questions/2009885/stopping-modal-when-window-is-closed-cocoa

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!