19

を表示するためdoubleClickActionに aを使用しています。このようなもの:NSTableViewNSPopover

NSInteger selectedRow = [dataTableView clickedRow];
NSInteger selectedColumn = [dataTableView clickedColumn];


// If something was not selected, then we cannot display anything.
if(selectedRow < 0 || selectedColumn < 0)
{
    NSLog(@"Invalid selected (%ld,%ld)", selectedRow, selectedColumn);
    return;
} // End of something was not selected

// Setup our view controller, make sure if there was already a popover displayed, that we kill that one off first. Finally create and display our new popover.
DataInspectorViewController * controller =
[[DataInspectorViewController alloc] initWithNibName: @"DataInspectorViewController"
                                              bundle: nil];

if(nil != dataPreviewPopover)
{
    [dataPreviewPopover close];
} // End of popover was already visible

dataPreviewPopover = [[NSPopover alloc] init];
[dataPreviewPopover setContentSize:NSMakeSize(400.0f, 400.0f)];
[dataPreviewPopover setContentViewController:controller];
[dataPreviewPopover setAnimates:YES];
[dataPreviewPopover showRelativeToRect: [dataTableView frameOfCellAtColumn: selectedColumn row: selectedRow]
                     ofView: dataTableView
              preferredEdge: NSMinYEdge];

これはうまく機能します。ポップオーバーは、ダブルクリックしたセルで作成および削除されます。問題は、ポップオーバーの外のどこかをクリックすると(別のセルを1回クリックするなど)、ポップオーバーを消したいということです。私は周りを見回してきましたが、私の人生では、それを行う方法がわかりません.

これは、ポップオーバーに組み込まれていると思われるものです(iOSクラスにあると確信していますUIPopoverController)ので、単純なものが欠けているのではないかと思っています。

4

3 に答える 3

68

ポップオーバーのプロパティの動作 (コード内またはインターフェイス ビルダー上) を次のように変更する必要があります。

popover.behavior = NSPopover.Behavior.transient;

NSPopover.Behavior.transient
ユーザーがポップオーバー外のユーザー インターフェイス要素と対話すると、システムはポップオーバーを閉じます。

詳細については、Apple のドキュメントを参照してください。

于 2013-02-17T14:45:14.417 に答える
13

フラグは私には.transient機能しません。

ただし、次の方法で機能させることができます。

1) ポップオーバーを表示するたびに、必ずアプリをアクティブ化します (私のアプリはメニューバー アプリなので、これは自動的には行われません)。

NSApp.activate(ignoringOtherApps: true)

2) アプリの外側をクリックすると、アプリが無効になります。AppDelegate でこれを検出できます

func applicationWillResignActive(_ notification: Notification) {
    print("resign active")
}

それに応じて行動する

于 2019-02-01T16:50:19.167 に答える
0

ほとんどtransientの場合はうまくいきましたが、ユーザーがアプリケーションの外部の要素を操作すると、ポップオーバーが非表示になるが閉じないため、問題が発生しました。

最終的に私のために働いたのは:

popover.behavior = .semitransient

アプリを変更したり、アプリ外の他の要素とやり取りしたりすると、ポップオーバーが閉じるようになりました。しかし、 とやり取りするときは閉じNSMenu、他のやり取りでも閉じない可能性があります。

NSPopover.Behavior.semitransientのドキュメントからの引用:

半一時的なポップオーバーを閉じる正確な相互作用は指定されていません。

NSPopover.Behavior.transientのドキュメントと同様:

一時的なポップオーバーを閉じる原因となる正確な相互作用は指定されていません。

于 2021-06-12T11:25:17.883 に答える