我试图创建一个文本字段,可以对用户按下iOS中的数字键盘上的删除按钮做出React。.onKeyPress(_ key:action:)工作,但只适用于硬件键盘和macOS(据我所知)。使用.onChange(of:)并检查TextField中的值可以工作,但不是我想要的方式。我想在 * TextField中没有字符并且用户按下删除 * 时做出React(据我所知,不能用.onChange(of:)完成)。你将如何实施这一点?
.onKeyPress(_ key:action:)
.onChange(of:)
fdx2calv1#
这是我写的最好的代码,它工作得很好,但是文本很小,它使用UIKit。如果你不喜欢它,你必须坚持文本比较逻辑。
import SwiftUI import UIKit struct ContentView: View { @State private var text = "" var body: some View { MyTextView(text: $text) .padding() } } struct MyTextView: UIViewRepresentable { @Binding var text: String class Coordinator: NSObject, UITextViewDelegate { var parent: MyTextView init(parent: MyTextView) { self.parent = parent } func textViewDidChange(_ textView: UITextView) { parent.text = textView.text } func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { if text.isEmpty && textView.text.isEmpty { print("Delete key pressed") } return true } } func makeCoordinator() -> Coordinator { Coordinator(parent: self) } func makeUIView(context: Context) -> UITextView { let textView = UITextView() textView.delegate = context.coordinator return textView } func updateUIView(_ uiView: UITextView, context: Context) { uiView.text = text } }
字符串更新:我也做了比较逻辑:
import SwiftUI struct ContentView: View { @State private var text = "Hello, World!" @State private var old = "Hello, World!" var body: some View { TextField("text" , text: $text) .onChange(of: text) { if text.count <= old.count { print("Deleted the letter: \(old.replacingOccurrences(of: text, with: ""))") } old = text } } }
型
1条答案
按热度按时间fdx2calv1#
这是我写的最好的代码,它工作得很好,但是文本很小,它使用UIKit。如果你不喜欢它,你必须坚持文本比较逻辑。
字符串
更新:我也做了比较逻辑:
型