gpt4 book ai didi

ios - SwiftUI Textfield Binding 在 iOS 15 中触发 2 次

转载 作者:行者123 更新时间:2023-12-05 05:53:27 30 4
gpt4 key购买 nike

我有一个 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 的一个 Unresolved 错误吗(或者)我需要做什么来解决这个问题。

引用文章 - 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) ")
}
}

关于ios - SwiftUI Textfield Binding 在 iOS 15 中触发 2 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69888391/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com