19

我正在使用doubleClickActionaNSTableView来显示 a 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];

哪个工作得很好。我的弹出框在我双击的单元格上创建和删除。问题是,如果我单击弹出框之外的任何位置(例如单击另一个单元格),我希望弹出框消失。我一直在环顾四周,但我一生都不知道该怎么做。

这是我假设内置在弹出窗口中的东西,(我相当肯定它在 iOSUIPopoverController类中)所以我只是想知道我是否遗漏了一些简单的东西。

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

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

引用NSPopover.Behavior.semitransient的文档:

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

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

未指定将导致瞬态弹出框关闭的确切交互。

于 2021-06-12T11:25:17.883 回答