Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSPopover-焦点丢失时隐藏?(在popover外单击)_Objective C_Macos_Cocoa_Nspopover - Fatal编程技术网

Objective c NSPopover-焦点丢失时隐藏?(在popover外单击)

Objective c NSPopover-焦点丢失时隐藏?(在popover外单击),objective-c,macos,cocoa,nspopover,Objective C,Macos,Cocoa,Nspopover,我正在使用NSTableView的双击操作来显示nspover。大概是这样的: NSInteger selectedRow = [dataTableView clickedRow]; NSInteger selectedColumn = [dataTableView clickedColumn]; // If something was not selected, then we cannot display anything. if(selectedRow < 0 || select

我正在使用
NSTableView
双击操作来显示
nspover
。大概是这样的:

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];
NSInteger selectedRow=[dataTableView clickedRow];
NSInteger selectedColumn=[dataTableView clickedColumn];
//如果未选择某些内容,则无法显示任何内容。
如果(selectedRow<0 | | selectedColumn<0)
{
NSLog(@“无效选定(%ld,%ld)”,selectedRow,selectedColumn);
返回;
}//未选择某物的结尾
//设置我们的视图控制器,确保如果已经显示了一个popover,那么我们首先要杀死它。最后创建并显示我们的新popover。
DataInspectorViewController*控制器=
[[DataInspectorViewController alloc]initWithNibName:@“DataInspectorViewController”
束:零];
if(nil!=datapreviewpover)
{
[数据预览关闭];
}//popover的结尾已经可见
DataPreviewPoOver=[[NSPoOver alloc]init];
[DataPreviewPooverSetContentSize:NSMakeSize(400.0f,400.0f)];
[DataPreviewPoover setContentViewController:controller];
[DataPreviewPoover设置动画:是];
[DataPreviewPover showRelativeToRect:[dataTableView frameOfCellAtColumn:selectedColumn行:selectedRow]
ofView:dataTableView
首选边:NSMinYEdge];
这很好用。我的弹出框在我双击的单元格上被创建和删除。问题是,如果我在弹出框之外的任何地方单击(比如单击另一个单元格),我希望弹出框消失。我一直在四处张望,但我一辈子都不知道该怎么做


这是我假设popover内置的东西(我相当确定它在iOS
UIPopoOvercontroller
类中),所以我只是想知道我是否遗漏了一些简单的东西。

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

nspover.Behavior.transient

当用户与popover外部的用户界面元素交互时,系统将关闭popover


请在中阅读更多信息。

瞬态
标志对我不起作用

但是,我可以通过以下方法使事情顺利进行:

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

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

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

并相应地采取行动

虽然暂时在大多数情况下都有效,但当用户与应用程序外部的元素交互时,这是一个问题,因为popover会隐藏但不关闭

最终为我工作的是:

popover.behavior=.semitential
现在,当更改应用程序或与应用程序之外的任何其他元素交互时,popover将关闭。但是当与
NSMenu
交互时,不会关闭,也可能不会与其他交互关闭

从文件中引用以下内容:

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

与以下文件类似:

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


当用户与应用程序外部的用户界面交互时,是否可能隐藏popover?在Objective-C中:
self.myPopover.behavior=NSPopoverBehaviorTransient这对Xamarin for MacOS使用
公共覆盖void WillResignActive(NSNotification notification)
NSApp.activate(ignoringOtherApps: true)
func applicationWillResignActive(_ notification: Notification) {
    print("resign active")
}