当我按 return 或在文本域外部单击时,如何移除文本域焦点? (SwiftUI, MacOS)
How can I remove Textfield focus when I press return or click outside Textfield? (SwiftUI, MacOS)
当我按下 return 或在文本域外部单击时,如何移除文本域焦点?
请注意,这是 MacOS.
上的 SwiftUI
如果我这样做:
import SwiftUI
struct ContentView: View {
@State var field1: String = "This is the Text Field View"
var body: some View {
VStack{
Button("Press") {
print("Button Pressed")
}
TextField("Fill in Text", text: Binding(
get: { print("get") ; return self.field1 },
set: { print("set") ; self.field1 = [=11=] }
)
)
}
}
}
然后单击进入 TextField 并对其进行编辑,然后单击 Button,TextField 不会失去焦点。我怎样才能让它退出编辑模式并失去焦点。
我还想在按下 Return 时失去对 TextField 的关注。
我将绑定初始化程序与 get 和 set 一起使用,因为我认为我可以以某种方式拦截按键并检测 'Return' 字符,但这不起作用。
感谢任何帮助:-)
以下是可能的变体
import SwiftUI
import AppKit
struct ContentView: View {
@State var field1: String = "This is the Text Field View"
var body: some View {
VStack{
Button("Press") {
print("Button Pressed")
NSApp.keyWindow?.makeFirstResponder(nil)
}
TextField("Fill in Text", text: Binding(
get: { print("get") ; return self.field1 },
set: { print("set") ; self.field1 = [=10=] }
), onCommit: {
DispatchQueue.main.async {
NSApp.keyWindow?.makeFirstResponder(nil)
}
}
)
}
}
}
只需使用以下行将 onTapGesture
添加到您的 VStack
:
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
此代码将关闭键盘。
示例:
VStack {
// ...
}.onTapGesture {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
}
根据之前的答案,我创建了一个 .removeFocusOnTap
扩展,可以附加到任何视图,点击时应移除焦点(我在背景视图上使用它)。它适用于 iOS 和 macOS。
public struct RemoveFocusOnTapModifier: ViewModifier {
public func body(content: Content) -> some View {
content
#if os (iOS)
.onTapGesture {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
}
#elseif os(macOS)
.onTapGesture {
DispatchQueue.main.async {
NSApp.keyWindow?.makeFirstResponder(nil)
}
}
#endif
}
}
分机:
extension View {
public func removeFocusOnTap() -> some View {
modifier(RemoveFocusOnTapModifier())
}
}
当我按下 return 或在文本域外部单击时,如何移除文本域焦点? 请注意,这是 MacOS.
上的 SwiftUI如果我这样做:
import SwiftUI
struct ContentView: View {
@State var field1: String = "This is the Text Field View"
var body: some View {
VStack{
Button("Press") {
print("Button Pressed")
}
TextField("Fill in Text", text: Binding(
get: { print("get") ; return self.field1 },
set: { print("set") ; self.field1 = [=11=] }
)
)
}
}
}
然后单击进入 TextField 并对其进行编辑,然后单击 Button,TextField 不会失去焦点。我怎样才能让它退出编辑模式并失去焦点。
我还想在按下 Return 时失去对 TextField 的关注。 我将绑定初始化程序与 get 和 set 一起使用,因为我认为我可以以某种方式拦截按键并检测 'Return' 字符,但这不起作用。
感谢任何帮助:-)
以下是可能的变体
import SwiftUI
import AppKit
struct ContentView: View {
@State var field1: String = "This is the Text Field View"
var body: some View {
VStack{
Button("Press") {
print("Button Pressed")
NSApp.keyWindow?.makeFirstResponder(nil)
}
TextField("Fill in Text", text: Binding(
get: { print("get") ; return self.field1 },
set: { print("set") ; self.field1 = [=10=] }
), onCommit: {
DispatchQueue.main.async {
NSApp.keyWindow?.makeFirstResponder(nil)
}
}
)
}
}
}
只需使用以下行将 onTapGesture
添加到您的 VStack
:
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
此代码将关闭键盘。
示例:
VStack {
// ...
}.onTapGesture {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
}
根据之前的答案,我创建了一个 .removeFocusOnTap
扩展,可以附加到任何视图,点击时应移除焦点(我在背景视图上使用它)。它适用于 iOS 和 macOS。
public struct RemoveFocusOnTapModifier: ViewModifier {
public func body(content: Content) -> some View {
content
#if os (iOS)
.onTapGesture {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
}
#elseif os(macOS)
.onTapGesture {
DispatchQueue.main.async {
NSApp.keyWindow?.makeFirstResponder(nil)
}
}
#endif
}
}
分机:
extension View {
public func removeFocusOnTap() -> some View {
modifier(RemoveFocusOnTapModifier())
}
}