Is there a way to force the NSPopover to start in the detached state? I only see isDetached
which is a read-only property for the state of the popover and an NSPopoverDelegate method detachableWindow(forPopover:)
which lets me override the window that gets created. I'd like to essentially click a button and have the NSPopover start in the state in this photo.
The style of this window is exactly what a product requirement is and I can't seem to find any NSWindow style settings that would make a window do something like this (nor an NSPanel)
This detached popover functionality seems special in that it:
- non-modal, but stays above main app. Able to still interact with the main app just like in Messages how you can still click around and type a new message.
- Clicking another app, AppFoo, puts both the main app and the helper window behind AppFoo.
- The helper window can be moved around and isn't hidden on app deactivation (another app gets selected).
- Has the little, native, grey X in the top left.
Here is the trick.
Use the required delegate method detachableWindowForPopover:
to do the work for you, like:
- (void) showPopoverDetached
{
NSWindow* detachedWindow = [self detachableWindowForPopover:nil];
[detachedWindow.windowController showWindow:nil];
}
Seems that the Apple engineers implemented detachableWindowForPopover:
on a pretty smart way, I guess it uses the content view controller class, and will always create a singleton like instance of the detached window.
Once detachableWindowForPopover:
has called the presented window instance will be re-used no matter when and why it is called, called it directly (from a func like my sample above) or indirectly (e.g. when you drag out, detach, the popover from its original position)
This way they can prevent a popover being detached 'twice' and we can also implement the detached way programmatically, nice job from them!
来源:https://stackoverflow.com/questions/51031704/nspopover-to-start-in-a-detached-state