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

Kyl*_*yle 13 macos cocoa objective-c nspopover

我正在使用doubleClickActiona NSTableView来显示一个NSPopover.像这样的东西:

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];
Run Code Online (Sandbox Code Playgroud)

哪个工作得很好.我在双击的单元格上创建并删除了我的popovers.问题是,如果我点击它之外的任何地方(比如单击另一个单元格),我想要弹出窗口消失.我一直在四处寻找,但因为我的生活无法弄清楚如何去做.

这是我假设内置到一个popover中的东西,(我很确定它是在iOS UIPopoverController类中)所以我只是想知道我是否遗漏了一些简单的东西.

ser*_*yne 56

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

popover.behavior = NSPopover.Behavior.transient;
Run Code Online (Sandbox Code Playgroud)

在docs中了解更多相关信息:https: //developer.apple.com/documentation/appkit/nspopover


Con*_*lon 11

.transient标志不会为我工作。

但是,我可以通过以下方式使事情发挥作用:

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

NSApp.activate(ignoringOtherApps: true)
Run Code Online (Sandbox Code Playgroud)

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

func applicationWillResignActive(_ notification: Notification) {
    print("resign active")
}
Run Code Online (Sandbox Code Playgroud)

并据此采取行动