NSPopover以分离状态启动

Kir*_*ova 5 macos cocoa nswindow nspopover swift

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

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

这种分离的弹出框功能在以下方面看起来很特别:

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

从消息中的“详细信息”按钮分离的NSPopover

Dar*_*ust 6

如果你不介意调用私有 API,其实很简单:

let detach = NSSelectorFromString("detach")
if popover.responds(to: detach) {
    popover.perform(detach)
}
Run Code Online (Sandbox Code Playgroud)

甚至不需要添加代表。我不知道这个私有方法是什么时候添加的,但至少从 macOS 10.13 开始它就可用了。不过,我怀疑自从推出以来它就可用了NSPopover


Hof*_*ofi 3

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

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

    [detachedWindow.windowController showWindow:nil];
}
Run Code Online (Sandbox Code Playgroud)

看来苹果工程师detachableWindowForPopover:以一种非常聪明的方式实现了,我猜它使用内容视图控制器类,并且总是会创建一个像分离窗口的单例实例。一旦detachableWindowForPopover:调用了呈现的窗口实例,无论何时以及为何调用它,都将重新使用它,直接调用它(从像我上面的示例的函数)或间接调用它(例如,当您从其原始位置拖出、分离、弹出窗口时) )

这样他们就可以防止弹出窗口“两次”分离,我们也可以通过编程实现分离方式,他们干得好!

这是一个关于它在现实生活中如何工作的小演示(在 macOS 10.13 - 13.0 上测试)

https://i.stack.imgur.com/hej75.jpg

  • 我也无法让建议发挥作用。它所做的只是弹出一个与弹出窗口没有连接的附加窗口。10.14测试 (2认同)