Skip to content

Instantly share code, notes, and snippets.

@stephancasas
Last active October 28, 2024 23:35
Show Gist options
  • Save stephancasas/f32270f2a4473a5673b3b5221ad8f486 to your computer and use it in GitHub Desktop.
Save stephancasas/f32270f2a4473a5673b3b5221ad8f486 to your computer and use it in GitHub Desktop.
SwiftUI focus-losing/first responder-losing (blur) text field
import SwiftUI
@main
struct ExampleApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ClickableBackground: NSViewRepresentable {
typealias ClickableCallback = (ClickableNSView) -> Void;
let onClick: ClickableCallback;
init(_ callback: @escaping ClickableCallback) {
self.onClick = callback;
}
class ClickableNSView: NSView {
var onClick: ClickableCallback = { _ in };
override func mouseDown(with event: NSEvent) {
self.onClick(self);
}
}
func makeNSView(context: Context) -> ClickableNSView {
let view = ClickableNSView();
view.onClick = self.onClick;
return view;
}
func updateNSView(_ nsView: ClickableNSView, context: Context) { }
}
struct ContentView: View {
@State var input: String = "";
var body: some View {
VStack(content: {
TextField("Sample Input", text: self.$input)
})
.padding()
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(ClickableBackground({ nsView in
nsView.window?.makeFirstResponder(nil);
}))
.onAppear(perform: {
DispatchQueue.main.async(execute: {
NSApplication.shared.keyWindow?.makeFirstResponder(nil);
})
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment