【问题标题】:SwiftUI Textfiled Binding triggering 2 times in iOS 15SwiftUI Textfield Binding 在 iOS 15 中触发 2 次
【发布时间】: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 中发生。

标签: ios swift swiftui


【解决方案1】:

你可以尝试这样的事情,在 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) ")
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多