【发布时间】:2021-11-08 18:41:08
【问题描述】:
我有一个 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 等以前的操作系统版本上发生。
这是 Apple 的一个未解决的错误(或)我需要做什么来解决这个问题。
参考文章-https://medium.com/flawless-app-stories/swiftui-passcode-field-for-otp-and-pin-entry-b61ba663dc31
【问题讨论】:
-
你在使用 introspect api 吗?可能是因为这个。你可以在没有它的情况下完成你的工作,为什么需要它?
-
我们必须在输入第 6 位时自动关闭键盘。这就是我使用它的原因。
-
即使没有 introspect api,问题仍然存在。
-
没有它你可以关闭键盘,我认为你的编码问题很糟糕。
-
通过内省删除代码后,我仍然看到问题。 boundPin setter 肯定会调用 2 次,就像我提到它只在 iOS 15 中发生。