NSPopover - Скрыть, когда фокус потерян? (щелкнул вне popover)
Я использую doubleClickAction
для 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];
Что работает просто отлично. Мои popovers создаются и удаляются по ячейкам, на которые я дважды нажимаю. Проблема в том, что я хочу, чтобы popover ушел, если я нажимаю где-нибудь за его пределами (например, один клик на другой ячейке). Я оглядывался, но жизнь меня не может понять, как это сделать.
Это то, что я бы предположил, встроен в popover (я довольно уверен, что это был класс iOS UIPopoverController
), поэтому мне просто интересно, не потерял ли что-нибудь что-то простое.
Ответы
Ответ 1
Вам нужно изменить поведение свойства вашего поповера (в коде или в конструкторе интерфейса) на:
popover.behavior = NSPopover.Behavior.transient;
NSPopover.Behavior.transient
Система закроет всплывающее окно, когда пользователь взаимодействует с элементом интерфейса пользователя вне всплывающего окна.
Подробнее об этом читайте в документации Apple.
Ответ 2
флаг .transient
у меня не работает.
Однако я могу заставить вещи работать следующим образом:
1) Каждый раз, когда я показываю свой поповер, я обязательно активирую приложение (мое приложение представляет собой приложение в строке меню, поэтому это не происходит автоматически)
NSApp.activate(ignoringOtherApps: true)
2) Когда я нажимаю вне приложения, мое приложение будет деактивировано. Я могу обнаружить это в AppDelegate
func applicationWillResignActive(_ notification: Notification) {
print("resign active")
}
и действовать соответственно