【问题标题】:How can I remove Textfield focus when I press return or click outside Textfield? (SwiftUI, MacOS)当我按回车键或单击文本字段外部时,如何删除文本字段焦点? (SwiftUI,MacOS)
【发布时间】:2020-03-18 03:07:52
【问题描述】:

当我按下回车键或在文本域外部单击时,如何移除文本域焦点? 请注意,这是 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 }
        )
      )
    }
  }
}

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

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

任何帮助表示赞赏:-)

【问题讨论】:

    标签: focus textfield swiftui keypress


    【解决方案1】:

    以下是可能的变体

    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)
                }
          }
          )
        }
      }
    }
    

    【讨论】:

    • 感谢 Asperi。这可以满足我的要求。奇怪的是,它两次调用 onCommit - 不知道为什么。不过不会给我带来问题。我现在意识到我需要一些额外的问题,但会作为另一个问题提出。
    • 我决定在这里问,因为这个额外的位在原始问题的主题行中:有没有办法在文本字段之外发生点击/点击时失去焦点?否则,我必须将 makeFirstResponder 位添加到所有其他有很多控件的控件中!
    • 实际上,默认情况下将 TextField 置于焦点是默认(又名正常)macOS 行为。因此,如果 UI 中没有其他可聚焦元素,则默认情况下它始终处于焦点。 (注意,单击按钮不会使按钮成为焦点)。因此,将焦点移出文本字段是相当非 mac 的行为。
    • 非常有用的评论 - 刚刚查看了一些与我的情况类似的应用程序,并且行为如您所描述的那样。
    • 我觉得很有趣的是,在没有真正了解正在发生的逻辑的情况下只使用 UI 很容易。如果你问我点击一个按钮是否会分散编辑的注意力,我会自信地说是的,但我错了。
    【解决方案2】:

    只需使用以下行将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)
    }
    

    【讨论】:

    • 感谢您的回答 - 但我认为 UIApplication 仅适用于 iOS,而我使用的是 macOS。
    • @Adahus 哦,我的错。刚刚做了一些研究,但找不到任何关于 macOS 上的焦点删除的信息。如果我很快找到任何东西,我会告诉你的。
    • 对于那些最终在这里寻找 iOS 解决方案的人仍然有用。 :)
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2012-04-19
    相关资源
    最近更新 更多