Как сохранить пользовательский ввод из 6 OTP UITextFields в свойстве перед передачей значения в проверку подлинности телефона Firebase для проверки в Swift 4 - PullRequest
0 голосов
/ 10 мая 2019

Создано 6 UITextFields для пользовательских OTP-входов.Я пробовал много способов, но он продолжает возвращаться - Не удается присвоить значение типа '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 голосов
/ 10 мая 2019

Прежде всего, вы должны поместить свои поля в массив:

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()
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...