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内置的东西(我相当确定它在iOSUIPopoOvercontroller
类中),所以我只是想知道我是否遗漏了一些简单的东西。您需要将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")
}