NSPopover以分离状态启动

时间:2018-06-25 21:00:35

标签: swift macos cocoa nswindow nspopover

是否有一种方法可以强制NSPopover以分离状态启动?我只看到isDetached,它是弹出框状态的只读属性,还有一个NSPopoverDelegate方法detachableWindow(forPopover:),它使我可以覆盖创建的窗口。我实际上想单击一个按钮,并使NSPopover在此照片的状态下启动。

此窗口的样式恰好是产品的要求,我似乎找不到任何NSWindow样式设置来使窗口做类似这样的事情(也没有NSPanel)

这种独立的弹出框功能在其中似乎很特别:

  1. 非模态,但保持在主应用之上。仍然能够与主应用程序交互,就像在“消息”中一样,如何仍然可以单击并键入新消息。
  2. 单击另一个应用程序AppFoo,会将主应用程序和帮助程序窗口都置于AppFoo后面。
  3. 助手窗口可以移动,并且在停用应用程序时不会隐藏(选择另一个应用程序)。
  4. 左上角有一个小小的本机灰色X。

Detached NSPopover from Details button in Messages

2 个答案:

答案 0 :(得分:2)

这是诀窍。 使用所需的委托方法detachableWindowForPopover:为您完成工作,例如:

- (void) showPopoverDetached
{
    NSWindow* detachedWindow = [self detachableWindowForPopover:nil];

    [detachedWindow.windowController showWindow:nil];
}

似乎苹果工程师以一种非常聪明的方式实现了detachableWindowForPopover:,我猜它使用了内容视图控制器类,并且将始终创建类似于独立窗口实例的单例。 一旦detachableWindowForPopover:调用了所呈现的窗口实例,无论何时何地被调用,都将被重复使用,直接(从上面的示例中的函数)或间接(例如,当您拖出,分离,从其原始位置弹出)

这样,它们可以防止弹出窗口“两次”分离,我们还可以以编程方式实现分离的方法,这对他们来说是一件好事!

答案 1 :(得分:1)

如果您不介意调用私有API,实际上非常简单:

let detach = NSSelectorFromString("detach")
if popover.responds(to: detach) {
    popover.perform(detach)
}

甚至无需添加委托。我不知道何时添加此私有方法,但至少自macOS 10.13起可用。不过,我怀疑自NSPopover推出以来就可以使用它。