我正在尝试创建一个文本字段,它可以对用户按下 iOS 中小键盘上的删除按钮做出反应。
.onKeyPress(_ key:action:)
可以工作,但仅适用于硬件键盘和macOS(据我所知)。
使用
.onChange(of:)
并检查 TextField 中的值可以工作,但不是我想要的方式。我想在 文本字段中没有字符并且用户按下删除 时做出反应(据我所知,无法使用 .onChange(of:)
完成)。
您将如何实施这个?
这是我想出的最好的代码,它运行得很好,但是文本非常小并且它使用 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
}
}