SwiftUI检测删除按钮是否被按下

6

我正在使用SwiftUI,但我正在编写自己的自定义文本掩码,但需要在用户按下“删除”键时进行删除。我正在使用onChange方法,但它无法检测到按下特殊键的操作。目前我正在使用:

TextField(self.placeholder, text: self.$text)
.onChange(of: self.text, perform: { value in
    print(value)
})

有没有办法检测删除按钮是否被按下?还是应该使用 UITextField 而不是 TextField


在哪个设备上,是macOS还是iPhone? - ios coder
1
你应该使用UITextField。下面这个链接可能会有帮助:https://stackoverflow.com/a/65840157/14733292 - Raja Kishan
在这里回答了一个完整的实现示例(https://stackoverflow.com/questions/76684922/detect-backspace-event-on-textfield-using-subclass-or-delegate-solution-integrat/77511527#77511527) - undefined
2个回答

4

你可以使用一种巧妙的方法来实现这个功能。

  • 首先,我们将记录文本字符串当前字符数量的计数。
  • 每当用户按下退格键时,我们在onChange处理程序中检查前一个字符计数是否高于新字符计数。
  • 如果是这样,我们将删除整个字符串,或者在按下删除键时要执行的任何操作。
import SwiftUI
struct SquareView: View {
    
    var placeholder = "test"
    @State var text = "test"
    @State var textLen = 4
    
    var body: some View {
        VStack {
            TextField(self.placeholder, text: self.$text)
            .onChange(of: self.text, perform: { value in
                if value.count < textLen {
                    self.text = "" // << removed the whole text but here you can insert anything you want to do when the delete button is pressed
                }
                textLen = value.count
            })
        }
    }
}

请记住这只是一种“hacky”的方法,存在风险。例如,如果用户粘贴的内容比当前文本更短。

2
当用户按下退格键时,.onChange不会被触发。 - Đorđe Nilović

2

MVVM + Combine 方式:

class RecoveryPasswordViewModel: ObservableObject {
  @Published var email: String = ""
  @Published var isValidTextFieldStatus = true
  var cancellables = Set<AnyCancellable>()

  init() {
    setTextFieldToValidWhenUserDelete()
  }

  func setTextFieldToValidWhenUserDelete() {
    $email
        .scan("", { [weak self] previousInput, currentInput in
            if previousInput.count > currentInput.count {
                self?.isValidTextFieldStatus = true
            }
            return currentInput
        })
        .sink { _ in }
        .store(in: &cancellables)
 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接