我正在使用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];
类中)所以我只是想知道我是否遗漏了一些简单的东西。
答案 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 的文档:
<块引用>没有指定会导致瞬时弹出窗口关闭的确切交互。