windowShouldClosedが呼ばれない

去年の9月末ごろParanoiaImportをリリースした。あの頃のSwiftのバージョンは覚えてはいない。

最近になって、ちょっといじってみるかという気になってソースコードを開いたら、色々バージョンアップが必要だと、Xcode先生に言われた。コードをいじるつもりがなければ放置するところだが、いじるとなっては仕方ない。言われるままのバージョンアップを行った。

すると、ウインドウを閉じたらアプリを終了するという機能が働かなくなった。ParanoiaImportでは、筆者は、こちらの記事を参考にwindowShouldCloseを使っていた。

えらいこっちゃでWebを彷徨った挙句、答えはやっぱりStackOverflowのこの記事にあった。

なんと、デリゲートメソッドのシグネチャがSwift3で変更になったというのだ。そう言われても筆者には分からない。噛み砕いて言うと、senderがAnyではなくNSWindowに変化している。つまり、以下のようになったのだ。

Swift3より前

func windowShouldClose(_ sender: Any) {

    NSApplication.shared().reply(toApplicationShouldTerminate: true)
    NSApplication.shared().terminate(self)

    return false
}

Swift3以降(Swift4)

func windowShouldClose(_ sender: NSWindow) {

    NSApplication.shared.reply(toApplicationShouldTerminate: true)
    NSApplication.shared.terminate(self)

    return false
}

最初のコードをコピペすると、Xcode先生に、このメソッドをprivateにしろとか言われてしまう。だが流石にそれでは話がおかしかろうと思ったところ、案の定であった。(実はたどり着くまで、トライアンドエラーを繰り返したのだが、そこは割愛しておく)

windowShouldClosedは、applicationShouldTerminateと連携する場合、必須の選択だと思われる。applicationShouldTerminateAfterLastWindowClosedは、この場合使えない。多分…。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL