Last active
September 4, 2018 06:43
-
-
Save frankrausch/d4b5c6d5f86e5c3c9fcec9bcf0ccef37 to your computer and use it in GitHub Desktop.
Prevent NSPopover from stealing an NSTextField’s focus when using the popover to display live search results. Swift adaption of Wil Shipley’s solution (https://stackoverflow.com/a/21111462)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
protocol PopoverFirstResponderStealingSuppression { | |
var suppressFirstResponderWhenPopoverShows: Bool { get } | |
} | |
class CustomDocumentWindow: NSWindow { | |
override func makeFirstResponder(_ responder: NSResponder?) -> Bool { | |
if responder != self.firstResponder, | |
let newFirstResponder = responder as? NSView { | |
let newFirstResponderWindow = newFirstResponder.window | |
let currentFirstResponder = self.firstResponder | |
var currentFirstResponderWindow: NSWindow | |
if let currentFirstResponder = currentFirstResponder as? NSWindow { | |
currentFirstResponderWindow = currentFirstResponder | |
} else if let currentFirstResponder = currentFirstResponder as? NSView, | |
let window = currentFirstResponder.window { | |
currentFirstResponderWindow = window | |
} else { | |
return super.makeFirstResponder(newFirstResponder) | |
} | |
if newFirstResponderWindow != self | |
&& newFirstResponderWindow != currentFirstResponderWindow | |
&& self.currentEvent?.window != newFirstResponderWindow { | |
var responderView: NSResponder? = newFirstResponder | |
while responderView != nil { | |
if let responderView = responderView as? PopoverFirstResponderStealingSuppression, | |
responderView.suppressFirstResponderWhenPopoverShows { | |
return false | |
} | |
responderView = (responderView as? NSView)?.superview | |
} | |
} | |
} | |
return super.makeFirstResponder(responder) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The
NSWindow
containing theNSTextField
(orNSSearchField
) must be subclassed asCustomDocumentWindow
.If you have an
NSCollectionView
inside theNSPopover
, yourNSCollectionView
subclass must adapt thePopoverFirstResponderStealingSuppression
protocol; not theNSPopover
subclass.