[英]IOS swift - How can I end the editing in textfield after opening a new view controller when textfield is tapped
[英]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.