tunaingot
@tunaingot

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

NSButtonを押した時にPopoverを表示させたい(ソースコードで実現する)

Q&A

Closed

NSButtonを押した時にPopoverを表示させたい(ソースコードで実現する)

SwiftでmacOSアプリを作っています。
作ったアプリが起動し、表示されたWindow上にあるボタンをクリックしたら、ポップオーバーで別のStoryboardにあるViewControllerを表示させたいです。

Storyboard上で繋げれば簡単にできます。
今回はソースコードでこれを実現したいです。

ここまではできています。

let sb = NSStoryboard(name: "myStoryboard", bundle: nil)
let vc = sb.instantiateInitialController() as! NSViewController

Storyboardは読み込めています。
また、そのStoryboardからViewControllerも取得できています。

この取得したvc(ViewController)をNSButtonのアクションでポップオーバー表示する方法が知りたいです。

StorybaordのInitial ControllerがWindowの場合、NSButtonのアクションでウィンドウを表示することは下記のようにできてます。

let sb = NSStoryboard(name: "CLPFParameter", bundle: nil)
let winCon = sb.instantiateInitialController() as! NSWindowController  

winCon.showWindow(self)

今回はボタンのアクションでViewControllerをPopoverで表示したいです。
ご存知の方がいらっしゃいましたら、ご教示ください。

0

1Answer

NSPopoverでできませんかね?

    let popover = NSPopover()
    popover.contentViewController = target_viewController

    //show
    popover.show(relativeTo: button.bounds, of: button, preferredEdge: .minY)

    //close
    popover.performClose(button)

今は時間が無く、動作確認していません。

1Like

Comments

  1. @tunaingot

    Questioner

    @nak435さん、早速のコメントありがとうございます。
    表示は無事できました!

    便乗ですみません。
    Storyboard上のボタンとViewControllerを接続した場合、

    ・ボタンをクリック
    ・Popover以外の場所をクリック

    でPopoverのウィンドウが消えます。
    この動作はどう実現すればいいかご教示いただけますでしょうか?

    ボタンのクリックの場合は、NSPopoverのインスタンスを保持していればisShownプロパティを確認してperformCloseを実行すれば良さそうです。

    ボタン以外で、Popover以外の場所をクリックして閉じる方法が思いつきません。

  2. @tunaingot

    Questioner

    NSPopoverを調べていて解決しました。

    NSPopoverのbehaviorプロパティが閉じる時の挙動を決めるのですね。
    私の場合は.transientが適していました。

    また、ボタンの上下左右どこに表示するかはshowメソッドの引数preferredEdgeに与えるんですね。
    minYってどういう意味かと思いましたが、今は.minYEdgeというのになってました。
    これはすぐわかりました。

    もう少し調べてから返信すればよかったです。

    @nak435さん、どうもありがとうございました!

  3. ボタン以外で、Popover以外の場所をクリックして閉じる方法が思いつきません

    showの前にpopover.behavior = .transientを入れたらどうですか?

    行き違いました

  4. @tunaingot

    Questioner

    @nak435さん、ありがとうございます。
    行き違いましたね。

    behaviorに気付くのが遅かったもので...
    .transientに指定すれば、NSPopoverのインスタンスを保持しなくてもいいですね。

    どうもありがとうございました。

  5. ✌️
    解決であれば、当Q&Aをクローズしてくださいね

Your answer might help someone💌