NSPopover - 焦点丢失时隐藏? (点击弹出窗口外)

时间:2013-02-16 12:06:17

标签: objective-c macos cocoa nspopover

我正在使用doubleClickAction的{​​{1}}来显示NSTableView。像这样:

NSPopover

哪种方法效果很好。我在双击的单元格上创建并删除了我的popovers。问题是,如果我点击它之外的任何地方(比如在另一个单元格上单击一下),我希望popover消失。我一直在四处寻找,但因为我的生活无法弄清楚如何去做。

我认为这是内置在一个popover中的(我很确定它是在iOS 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]; 类中)所以我只是想知道我是否遗漏了一些简单的东西。

3 个答案:

答案 0 :(得分:54)

您需要将popover的属性行为(在代码或界面构建器中)更改为:

popover.behavior = NSPopover.Behavior.transient;
  

NSPopover.Behavior.transient
  当用户与弹出窗口外的用户界面元素交互时,系统将关闭弹出窗口。

Apple's documentation了解详情。

答案 1 :(得分:0)

.transient标志对我不起作用。

但是我可以通过以下方法使事情正常进行:

1)每当我显示弹出窗口时,请确保我激活了该应用程序 (我的应用是菜单栏应用,因此不会自动发生)

NSApp.activate(ignoringOtherApps: true)

2)当我在应用程序外部单击时,我的应用程序将被停用。我可以在AppDelegate中检测到这一点

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

并采取相应行动

答案 2 :(得分:0)

虽然 transient 适用于大多数情况,但当用户与应用程序外部的元素交互时会出现问题,因为弹出窗口会隐藏但不会关闭

最终对我有用的是:

popover.behavior = .semitransient

现在,当更改应用程序或与应用程序之外的任何其他元素交互时,弹出窗口会关闭。但是在与 NSMenu 交互时不会关闭,并且可能不会与其他交互关闭。

引用 NSPopover.Behavior.semitransient 的文档:

<块引用>

未指定导致半瞬态弹出窗口关闭的确切交互。

类似于 NSPopover.Behavior.transient 的文档:

<块引用>

没有指定会导致瞬时弹出窗口关闭的确切交互。