Захват кнопки закрытия окна на Snow Leopard - PullRequest
2 голосов
/ 20 декабря 2011

Я работаю над приложением на основе NSDocument с несколькими документами на окно (вкладки). Это означает, что мне нужно самостоятельно обработать закрытие окон, чтобы я мог просмотреть документы, принадлежащие окну, прежде чем оно закроется. Чтобы сделать это, я получил доступ к кнопке закрытия NSWindow с помощью standardWindowButton:NSWindowCloseButton и установил цель / действие этой кнопки для моего метода вместо стандартного (и частного) _close: метода.

Это прекрасно работает на Lion, но на Snow Leopard это вызывает проблемы. Всякий раз, когда отображается модальное диалоговое окно, кнопка закрытия отключается, как и ожидалось. Но когда модальное диалоговое окно закрывается, на Snow Leopard кнопка закрытия никогда не включается. После этого я попытался включить его программно, используя [closeButton setEnabled:YES] и т. Д., Но, похоже, это не дает никакого эффекта. Я подтвердил, что это происходит только тогда, когда я изменил цель / действие кнопки закрытия.

Есть идеи, как избежать такого поведения на Snow Leopard, или, может быть, альтернативный способ взлома кнопки закрытия? Что управляет включенным состоянием кнопок панели инструментов? Может быть, я мог бы что-то там переопределить?

1 Ответ

4 голосов
/ 21 декабря 2011

Я бы подумал, что вы можете использовать windowShouldClose: Метод делегата

Установите делегат Windows в AppDelegate.А в AppDelegate используйте метод windowShouldClose: Delegate для вызова вашего метода close и для остановки закрытия окна, возвращая NO .В вашем методе сделайте всю проверку, а затем выполните Close: окно.Смотрите мой пример

 NSWindow * thisWindow; //--pointer to window that will be closed
BOOL windowClose;//-- bool for confirming close of window.

- (BOOL)windowShouldClose:(id)sender{
    thisWindow =sender;//-- set thisWindow to the sender window,the one that is to be closed )
    //if (sender ==theWindow) {//--you can use this to do further checking

        if (windowClose) {//-- Close window if YES
            return YES;  
        } 
    //}


    [self performSelector:@selector(myCloseWindow) ];//go to your method
    windowClose =FALSE;//-- reset
    return NO;//do not close window here
}

- (void) myCloseWindow {
    NSLog(@"closing window");//-- do your stuff
    windowClose =TRUE;//--give the ok to close the window
    [thisWindow performClose:thisWindow];//-- perform the close, which will be redirected back to the delegate, which will now allow the window to close
}
...