Остановка модального режима при закрытии окна (Какао) - PullRequest
4 голосов
/ 06 января 2010

В настоящее время я отображаю модальное окно, используя этот код:

[[NSApplication sharedApplication] runModalForWindow:mainWindow];

Однако, когда я закрываю это окно, другие окна остаются неактивными. Как запустить метод stopModal, когда окно закрыто с помощью «красного х»?

Спасибо,

Michael

Ответы [ 4 ]

9 голосов
/ 06 января 2010

Вы можете создать делегата для окна и заставить его отвечать либо на
- (void) windowWillClose: (NSNotification *) уведомление или
- (void) windowShouldClose: (NSNotification *) уведомление методы, подобные следующим:

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

См. Центр разработки Mac: ссылка на протокол NSWindowDelegate

2 голосов
/ 06 января 2010

Если у вас есть диалог, который применяется к конкретному окну, то вам, вероятно, следует использовать не модальное диалоговое окно, а лист. По возможности следует избегать модальных диалогов. Если вы используете лист, проблема, с которой вы столкнулись, больше не будет проблемой.

- (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];
}
0 голосов
/ 24 января 2019

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)
}
0 голосов
/ 13 июня 2015

Наряду с ответом Рэндалла вы можете связать класс контроллера как делегат для окна, определенного в вашем файле .xib.

Вы можете обрабатывать

[[NSApplication sharedApplication] stopModal];

в любом

  • -(void)performClose:(id)sender

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

* * Методы тысячи двадцать-одина.
...