2010-05-28 3 views
16

Как сделать приложение для какао закрыто, когда основное окно закрыто? Без этого вы должны щелкнуть значок приложения и выйти в меню.Сделать приложение для какао закрыто, когда основное окно закрыто?

+2

Хотя это правильный вопрос, передумайте. Если ваше приложение должно всегда присутствовать в главном окне, отключите возможность его закрытия. –

+1

Справедливо, я сделаю это. Спасибо! –

+13

Я не согласен. В большинстве приложений с одним окном, включая Калькулятор и (в настоящее время) Системные настройки, вы можете закрыть окно, и это завершает работу приложения. И я лично использовал приложения, которые пошли другим путем, и были разочарованы, когда я попытался закрыть главное окно и получил звуковой сигнал вместо того, чтобы закрыть/закрыть я хотел. –

ответ

23

Вы можете реализовать applicationShouldTerminateAfterLastWindowClosed:, чтобы вернуть ДА в делегат вашего приложения. Но я бы дважды подумал, прежде чем делать это, так как это действительно необычно на Mac за пределами небольших «полезных» приложений, таких как Калькулятор, и большинство пользователей Mac не оценят, как ваше приложение ведет себя так странно.

+3

На самом деле Apple однажды отклонила мое приложение и предложила реализовать его. Они сказали, что мне нужен либо ясный способ снова открыть главное окно, либо реализовать «applicationShouldTerminateAfterLastWindowClosed» –

+1

@nute: Ну, да, должен быть простой способ открыть окно. Приложение, в котором вы нажимаете на значок, и ничего не происходит, не является хорошим UX. Это далеко не говорит о том, что приложения в целом должны выйти, когда закрывается последнее окно. – Chuck

6

Вы должны иметь IBOutlet в своем главном окне. Например: IBOutlet NSWindow * mainWindow;

- (void)awakeFromWindow { 
    [mainWindow setDelegate: self]; 
} 
- (void)windowWillClose:(NSNotification *)notification { 
    [NSApp terminate:self]; 
} 

Если это не работает, вы должны добавить наблюдателя к вашему NSNotificationCenter для уведомления NSWindowWillCloseNotification. Не забудьте проверить, закрывается ли правое окно.

10

Добавьте этот фрагмент кода для делегата вашего приложения:

-(BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app { 
    return YES; 
} 
4

Как речь идет в основном о программировании какао и не о конкретных языка (Objective-C), здесь Swift версия Чак и Стива ответ:

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

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

    // Your other application delegate methods ... 

} 

для Swift 3 изменить определение методом

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

Я добавил этот ответ в духе мета-вопроса [Являются ли новые ответы Быстро ответа на старые вопросы Objective-C полезными?] (Http://meta.stackoverflow.com/questions/303338/are-new-swift-answers- on-old-objective-c-questions-useful), и потому, что я закрыл новый вопрос, задав явно код Swift как дубликат этого. –

+0

Swift 3 требует подчеркивания и пробела перед текстом отправителя. – dylan

+0

@dylan: Да, спасибо! –

Смежные вопросы