SwiftUI:检测iOS中的删除键

ehxuflar  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(124)

我试图创建一个文本字段,可以对用户按下iOS中的数字键盘上的删除按钮做出React。
.onKeyPress(_ key:action:)工作,但只适用于硬件键盘和macOS(据我所知)。
使用.onChange(of:)并检查TextField中的值可以工作,但不是我想要的方式。我想在 * TextField中没有字符并且用户按下删除 * 时做出React(据我所知,不能用.onChange(of:)完成)。
你将如何实施这一点?

fdx2calv

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

相关问题