How to stop modal with close button in NSWindowController?

Refresh

November 2018

Views

5.3k time

4

I want to stop modal when the user clicks the red close button in NSWindowController.

In the NSWindowController, there are "OK" and "Cancel" buttons.

- (IBAction)okButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSOKButton];
    [self.window close];
}

- (IBAction)cancelButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSCancelButton];
    [self.window close];
}

And when I click the red close button, the window will close and the modal doesn't stop. I've found the windowWillClose: function.

- (void)windowWillClose:(NSNotification *)notification
{
    if ([NSApp modalWindow] == self.window)
        [NSApp stopModal];
}

However,

if ([NSApp runModalForWindow:myWindowController.window] != NSOKButton)
    return;

Even if I click the OK button, windowWillClose: function is called and runModalForWindow: function always returns NSCancelButton.

I can add the member variable into myWindowController as the result of the modal.

But I think that there'll be another generic way to resolve this problem.

I want to take an easy way.

Yun

3 answers

4

Может быть , это немного поздно, но я только что нашел этот вопрос в попытке найти ответ для себя. И вот что сказано в официальной документации: есть - (BOOL)windowShouldClose:(id)senderобработчик событий , который не вызывается при закрытии окна с помощью [закрытие окна]. Это называется только тогда , когда вы используете красную кнопку закрытия или [окно performClose:] селекторы. Таким образом, решение реализовать windowShouldClose:вместо windowWillClose:вашей NSWindowController подкласса.

3

Вы можете попробовать, как это

- (IBAction)okButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSOKButton];
    [NSApp endSheet:self.window];
}

- (IBAction)cancelButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSCancelButton];
    [NSApp endSheet:self.window];
}
1

В соответствии с NSapplication Класс Ссылка на endSheet: методы по NSApplication будет устаревшим 10.10 (Mavericks). Apple , рекомендует использовать NSWindow beginSheet: и endSheet: методы , так что если вы пытаетесь отпустить NSWindowController из вашего NSWindowController подкласса вы должны использовать этот код

[self.window.sheetParent endSheet:self.window];

Он использует NSWindow в sheetParent свойство вызывать endSheet: и передает окно подкласса в качестве аргумента. Вы можете также использовать NSWindow в endSheet: код возврата: если вы хотите , чтобы указать код возврата. Проверено на OSX 10.9 / XCode 6.1.1