当我按下回车键或在文本字段外单击时,如何移除文本字段焦点?(SwiftUI,MacOS)

Ada*_*hus 6 focus keypress textfield swiftui

当我按下回车键或在文本字段外单击时,如何移除文本字段焦点?请注意,这是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 = $0 }
        )
      )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后单击 TextField 并对其进行编辑,然后单击 TextField 不会失去焦点的按钮。如何让它退出编辑模式并失去焦点。

如果我按 Return,我也想从 TextField 失去焦点。我将绑定初始化程序与 get 和 set 一起使用,因为我认为我可以以某种方式拦截按键并检测“返回”字符,但这不起作用。

任何帮助表示赞赏:-)

Tob*_*ink 15

只需添加一个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)
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些最终来到这里寻找 iOS 解决方案的人来说仍然有用。:) (5认同)

vie*_*dev 8

根据前面的答案,我创建了一个.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
    }
}
Run Code Online (Sandbox Code Playgroud)

扩大:

extension View {
    public func removeFocusOnTap() -> some View {
        modifier(RemoveFocusOnTapModifier())
    }
}
Run Code Online (Sandbox Code Playgroud)


Asp*_*eri 6

以下是可能的变体

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 = $0 }
        ), onCommit: {
            DispatchQueue.main.async {
                NSApp.keyWindow?.makeFirstResponder(nil)
            }
      }
      )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,默认情况下将 TextField 置于焦点是 macOS 的默认行为(也称为正常行为)。因此,如果 UI 中没有其他可聚焦元素,则默认情况下它将始终处于焦点状态。(请注意,单击按钮不会使按钮成为焦点)。因此,将焦点移出文本字段是相当不类似 Mac 的行为。 (2认同)