簡體   English   中英

如何檢測何時點擊 TextField? (MacOS 上的 SwiftUI)

[英]How can I detect when TextField is tapped? (SwiftUI on MacOS)

如何檢測何時點擊 TextField? (MacOS 上的 SwiftUI)

import SwiftUI

struct ContentView: View {
  @State var field: String = "TextField"
  
  var body: some View {
    TextField("Fill in Text", text: $field)
      .onTapGesture {
        print("Textfield pressed")
    }
  }
}

當 TextField 被點擊時,它不會打印“Textfield press”。 我猜這是因為在 TextField 手勢檢測到它之前,TextField 會拾取點擊。

.simultaneousGesture修飾符可以滿足您的需要。

這是一個例子:

struct TestTextTap: View {
    @State var field: String = "TextField"

    var body: some View {
      TextField("Fill in Text", text: $field)
        .simultaneousGesture(TapGesture().onEnded {
          print("Textfield pressed")
        })
    }
}

您可以檢測TextField何時在onEditingChanged內輕松聚焦,而不是 Taping:

TextField("Fill in Text", text: $field, onEditingChanged: { focused in
    print(focused ? "focused" : "unfocused")
}

我能夠得到預期的結果,但在 macOS 可以在文本字段中注冊一個點擊之前,感覺有點不自然。

我在 TextField 頂部覆蓋了一個幾乎透明的矩形。 如果此時感應到輕擊,則無法選擇 TextField,但在 SwiftUI 中,您可以使用 @FocusState boolean 使其成為焦點。

所以當感應到 onTapGesture 時,它會將@FocusState 變量更改為 true,這將讓用戶在 TextField 中鍵入。

macOS 中讓一切變得如此復雜的微小差異有時令人抓狂。

    @State var field: String = "TextField"
    @FocusState private var textFieldIsFocused: Bool

    var body: some View {
        TextField("Fill in Text", text: $field)
            .focused($textFieldIsFocused)
            .overlay((Color.white.opacity(0.0001)))
            .onTapGesture {
                self.textFieldIsFocused = true
                print("Textfield pressed")
            }
    }

抱歉,已編輯,因為我意識到我沒有包含 .focused 方法!

不幸的是, .simultaneousGesture在 macOS 上對我不起作用,但起作用的是使用Introspect獲取 NSTextField 並向其添加NSClickGestureRecognizer

然后我添加了一個@StateObject來處理目標/動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM