SwiftUI文本文件绑定在iOS 15中触发2次



我有一个OTP屏幕,用户在文本文件(隐藏在背景上(上输入OTP(6位数字(,一旦用户输入第6位数字,我将关闭键盘并进行API调用。

private var maxDigits: Int = 6
@Binding private var pin: String
private var backgroundField: some View {

let boundPin = Binding<String>(get: { self.pin }, set: { newValue in
self.pin = newValue
self.submitPin() // API call method
})

return TextField("", text: boundPin, onCommit: submitPin)
.accentColor(.clear)
.foregroundColor(.clear)
.keyboardType(.numberPad)
.introspectTextField { textField in
textField.tintColor = .clear
textField.textColor = .clear
textField.keyboardType = .numberPad
textField.textContentType = .oneTimeCode
if pin.count == maxDigits {
textField.resignFirstResponder()
} else {
textField.becomeFirstResponder()
}
}
}

我在iOS 15上遇到的问题是,当用户输入第6位时;submitPin";方法被调用了2次。这种情况只发生在iOS 15上,而不是在iOS 14/13/12等早期操作系统版本上。

这是苹果的一个开放漏洞吗?我需要做些什么来修复它。

参考文章-https://medium.com/flawless-app-stories/swiftui-passcode-field-for-otp-and-pin-entry-b61ba663dc31

你可以试试这样的东西,在ios 15:上对我有用

struct ContentView: View {
private var maxDigits: Int = 6
@State private var pin: String = ""

private var backgroundField: some View {
TextField("enter 6 digits pin number", text: Binding(
get: { pin },
set: { newValue in
if newValue.count == maxDigits {
pin = newValue
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
submitPin()
}
}))
.accentColor(.clear)  
.foregroundColor(.clear)
.keyboardType(.numberPad)
}

var body: some View {
backgroundField.border(.red).padding()
}
func submitPin() {
print("----> submitPin pin: (pin) ")
}
}

最新更新