在将值传递给Firebase电话身份验证以在Swift 4中进行验证之前,如何将用户输入从6个OTP UITextFields存储到属性中

时间:2019-05-10 14:37:12

标签: ios swift xcode uitextfield

为用户OTP输入创建6 UITextFields。我尝试了很多方法,但是它一直在返回-无法分配类型'UITextField的值?键入“ String?”

import UIKit
import Firebase

class OTPRequestViewController: UIViewController, UITextFieldDelegate{

    var verifyfromRegistration = RegisterViewController()


    @IBOutlet weak var textOTP1: UITextField!
    @IBOutlet weak var textOTP2: UITextField!
    @IBOutlet weak var textOTP3: UITextField!
    @IBOutlet weak var textOTP4: UITextField!
    @IBOutlet weak var textOTP5: UITextField!
    @IBOutlet weak var textOTP6: UITextField!




    override func viewDidLoad() {
        super.viewDidLoad()

        textOTP1.delegate = self
        textOTP2.delegate = self
        textOTP3.delegate = self
        textOTP4.delegate = self
        textOTP5.delegate = self
        textOTP6.delegate = self

}


    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        if (textField.text!.count < 1) && (string.count > 0) {
            if textField == textOTP1 {
                textOTP2.becomeFirstResponder()
            }
            if textField == textOTP2 {
                textOTP3.becomeFirstResponder()
            }
            if textField == textOTP3 {
                textOTP4.becomeFirstResponder()
            }
            if textField == textOTP4 {
                textOTP5.becomeFirstResponder()
            }
            if textField == textOTP5 {
                textOTP6.becomeFirstResponder()
            }
            if textField == textOTP6 {
                textOTP6.resignFirstResponder()
            }

            textField.text = string
            return false

        }else if (textField.text!.count >= 1) && (string.count == 0) {

            if textField == textOTP2 {
                textOTP1.becomeFirstResponder()
            }
            if textField == textOTP3 {
                textOTP2.becomeFirstResponder()
            }
            if textField == textOTP4 {
                textOTP3.becomeFirstResponder()
            }
            if textField == textOTP5 {
                textOTP4.becomeFirstResponder()
            }
            if textField == textOTP6 {
                textOTP5.becomeFirstResponder()
            }
            if textField == textOTP1 {
                textOTP1.resignFirstResponder()
            }

            textField.text = ""
            return false

        } else if (textField.text!.count) >= 1 {
            textField.text = string
            return false
        }


        return true
    }



    @IBAction func oTPButtonPressed(_ sender: UIButton) {



       guard let otpCode = textOTP1.text else {return}

        guard let verificationiD = verifyfromRegistration.defaults.string(forKey: "verificationId") else {return}


        let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationiD, verificationCode: otpCode)

        Auth.auth().signInAndRetrieveData(with: credential) { (success, error) in
            if error == nil {

                print("User Signed in! Sucess!!")

               self.performSegue(withIdentifier: "goToOTPVerified", sender: self)

            }else {
                print("Something went wrong!")
            }
        }


    }

预期的输出是合并6个UItextField的输出,并将其发送到let属性

1 个答案:

答案 0 :(得分:0)

首先,您应该将字段放入数组:

var otpFields: [UITextField] {
   return [textOTP1!, textOTP2!, textOTP3!, textOTP4!, textOTP5!, textOTP6!]
}

然后轻松获得全部输入:

let otpCode = otpFields.compactMap { $0.text }.joined()

还要注意,将字段放入数组可以大大简化您的代码,例如:

if (textField.text!.count < 1) && (string.count > 0) {
   guard let index = otpFields.index(where: { $0 === textField }) else { return }
   if index + 1 < fields.count {
       otpFields[index + 1].becomeFirstResponder()
   } else {
       textField.resignFirstResponder()
   }
}