Положение окна не восстанавливается при его закрытии нажатием кнопки x?

Я хочу восстановить положение окна моего приложения Cocoa всякий раз, когда пользователь запускает приложение. Эта функция реализована по умолчанию в Cocoa. Однако я также хочу закрыть приложение, нажав красную кнопку x вверху. -левый угол на панели инструментов, поэтому в AppDelegate.swift я написал следующее:

func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool {
    return true
}

Приложение немедленно закрывается нажатием красной кнопки x. Однако если вы завершите приложение таким образом, окно не вернется в предыдущее состояние при следующем открытии приложения.

Почему приложение не восстанавливается, когда вы завершаете работу приложения, закрывая окно? И как я могу восстановить, даже если пользователь завершает работу приложения, закрывая окно?


person Blaszard    schedule 01.02.2015    source источник
comment
Какой механизм вы используете для восстановления положения окна, когда оно закрыто другими способами? Имя автосохранения кадра?   -  person Ken Thomases    schedule 01.02.2015
comment
@KenThomases Я ничего не использую. Окно восстанавливается по умолчанию, когда вы выходите из приложения, нажав ⌘ + Q, я думаю.   -  person Blaszard    schedule 01.02.2015
comment
Ваши окна восстанавливаются, если 1: у вас установлен флажок для восстановления в IB (что вы делаете, основываясь на ваших комментариях) и 2: окно ЕЩЕ ОТКРЫТО, когда вы выходите из приложения. Если закрыть окно до выхода, позиция не восстанавливается. В вашей ситуации вы уже закрыли окно, поэтому состояние не восстанавливается.   -  person zeppenwolf    schedule 01.02.2015
comment
@zeppenwolf Я подтвердил, что флажок восстанавливаемый установлен в IB. По поводу 2) спасибо за советы!   -  person Blaszard    schedule 02.02.2015


Ответы (2)


Вы можете сделать это двумя способами

1) Вы можете сохранить рамку окна в plist, когда делегат окна запустит закрытие и переместит окно в этом фрейме, когда оно снова откроется.

2) Таким образом, как и в комментарии Zeppenwolf, вы можете вернуть NO в windowShouldClose и вызвать задержку завершения приложения.

person Sheen Vempeny    schedule 03.02.2015

Основываясь на комментарии zeppenwolf, я реализовал следующее в своем NSWindowDelegate

- (BOOL)windowShouldClose:(NSWindow *)sender {
    [[NSOperationQueue currentQueue] addOperationWithBlock:^{
        [NSApp terminate:sender];
    }];

    return NO;
}
person Julian F. Weinert    schedule 25.04.2020