@tunaingot

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

メニューからウィンドウをSegueのShowで1枚だけ表示させる方法

メニューからウィンドウを表示したい

アプリケーションメニューの「Preferences...」から表示する環境設定ウィンドウを作りたいです。

ウィンドウは"Main"Storyboardの中にあって、メニューのPreferences...とSegueのShowで接続しました。

スクリーンショット 2023-09-29 8.21.46.png

これでメニューのPreferences...を選べば、目的のウィンドウは表示されます。

Preferences...を選ぶと何枚もウィンドウが出現

ところが、該当ウィンドウを表示した状態で、もう一度Preferences...をメニューで選ぶと、2枚目のウィンドウができてしまいます。

Segueを使うことは適切ではない?

この問題を解決するのは容易でしょうか?
それとも、メニューからウィンドウを表示したい時にSegueを使うのは適切ではないのでしょうか?

ご存知の方がいらっしゃいましたら、ご教示ください。

0 likes

1Answer

Segueで遷移する直前で、下記のメソッドが呼ばれます。ここで、何か対処するコードを書けばよいかと思います。単純に今のウィンドウを閉じればよいのかな??

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    //ToDo
    self.view.window?.close() //??
}
0Like

Comments

  1. @tunaingot

    Questioner

    @nak435さん、コメントありがとうございます。

    import Cocoa
    
    class CPreferencesWindow: NSWindowController {
    
        override func windowDidLoad() {
            super.windowDidLoad()
        
            // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
        }
    
    }
    
    extension CPreferencesWindow {
        override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
            print("prepare window")
        }
    }
    

    Segueで表示されるWindowControllerを継承したCPreferencesWindowControllerを作り、prepareをオーバーライドしてみました。
    しかし、prepareメソッドは呼ばれません...

    Segueの接続の仕方に問題があるのでしょうか?
    確認すべき点、思い当たるところはございますか??

  2. @tunaingot

    Questioner

    色々試してみました。
    NSWindowControllerを継承したクラスを作ると、色々うまくいかないことが出てきました。
    そこで、NSWindowsControllerに関連づけられたNSViewControllerを継承したCPreferencesViewクラスを作って対応しました。

    CPreferencesViewにisShownというプロパティを用意し、Window(View)が表示されたらtrueにし、破棄されたらfalseにします。

    NSViewControllerでは、表示しているWindowsも参照できるので、

        override func viewDidAppear() {
            if CPreferencesView.isShown {  //すでにwindowが表示されていたら
                view.window?.close()
            } else {
                CPreferencesView.isShown = true
                view.window?.title = "Preferences"  //windowのタイトルをPreferencesにする
            }
        }
        
        override func viewDidDisappear() {
            CPreferencesView.isShown = false
        }
    

    という感じにして対応しました。

  3. @tunaingot

    Questioner

    override func viewDidDisappear() {
            CPreferencesView.isShown = false
        }
    

    ここでisShownをfalseにすると、viewDidAppear ()で強制的にclose()した時にもisShownがfalseになってしまうことが判明。
    当たり前ですが。

    ちょうどPreferencesウィンドウを閉じるボタンがあるので、そのボタンを押した時にisShownをfalseにして、表示されているWindowがなくなった時にisShownがfalseになるようにしました。

Your answer might help someone💌