как отключить промежуточное появление курсора на textFields в otpscreen в Swift 4 - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть экран OTP с 6 текстовыми полями, и мне нужен курсор, чтобы не перемещаться в конкретное текстовое поле, когда я нажимаю на конкретное текстовое поле.

Я уже реализовал код для автоматического перемещения курсора из одноготекстовое поле к другому, но если я коснусь определенного текстового поля (скажем, 4-го), курсор перемещается туда.

Пожалуйста, помогите мне с этой проблемой, и спасибо заранее.

Мой экран OTP:

Мой код:

func setDelegateAndTargetForAllTextFields() {

    textField1.delegate = self
    textField2.delegate = self
    textField3.delegate = self
    textField4.delegate = self
    textField5.delegate = self
    textField6.delegate = self

    textField1.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
    textField2.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
    textField3.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
    textField4.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
    textField5.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)
    textField6.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControl.Event.editingChanged)



}

@IBAction func otpBtnTapped(_ sender: UIButton) {

    if let text1 = textField1.text, let text2 = textField2.text, let text3 = textField3.text, let text4 = textField4.text,let text5 = textField5.text,let text6 = textField6.text {

        if text1+text2+text3+text4+text5+text6 == ""{

            showAlert(message: "Otp Cannot be empty!.")

            textField1.text = ""
            textField2.text = ""
            textField3.text = ""
            textField4.text = ""
            textField5.text = ""
            textField6.text = ""
            textFieldIntermediateEditingDisabled()

        }
        else{

            let setPinVC = self.storyboard?.instantiateViewController(withIdentifier: "pinVC") as! SetPinVC
            self.navigationController?.pushViewController(setPinVC, animated: true)




        }

    }

}

@objc func textFieldDidChange(textField: UITextField) {

    let text = textField.text

    if text?.count == 1 {

        switch textField{

        case textField1:
            //if textField2.isEnabled == false{
                //textField2.isEnabled = true
            //}
            textField2.becomeFirstResponder()
        case textField2:
            //if textField3.isEnabled == false{
               // textField3.isEnabled = true
           // }
            textField3.becomeFirstResponder()
        case textField3:
            //if textField4.isEnabled == false{
                //textField4.isEnabled = true
            //}
            textField4.becomeFirstResponder()
        case textField4:
            //if textField5.isEnabled == false{
                //textField5.isEnabled = true
            //}
            textField5.becomeFirstResponder()
        case textField5:
           // if textField6.isEnabled == false{
                //textField6.isEnabled = true
            //}
            textField6.becomeFirstResponder()
        default:
            break

        }

    }

    if text?.count == 0  {

        switch textField {

        case textField1:
            //if textField1.isEnabled == false{
                //textField1.isEnabled = true
            //}
            textField1.becomeFirstResponder()
        case textField2:
           // if textField1.isEnabled == false{
                //textField1.isEnabled = true
            //}
            textField1.becomeFirstResponder()
        case textField3:
            //if textField2.isEnabled == false{
                //textField2.isEnabled = true
            //}
            textField2.becomeFirstResponder()
        case textField4:
            //if textField3.isEnabled == false{
                //textField3.isEnabled = true
            //}
            textField3.becomeFirstResponder()
        case textField5:
            //if textField4.isEnabled == false{
               // textField4.isEnabled = true
            //}
            textField4.becomeFirstResponder()
        case textField6:
            //if textField5.isEnabled == false{
                //textField5.isEnabled = true
            //}
            textField5.becomeFirstResponder()
        default:
            break

        }
    }

}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}


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


    let maxLength = 1
    let currentString: NSString = textField.text! as NSString
    let newString: NSString =
        currentString.replacingCharacters(in: range, with: string) as NSString
    return newString.length <= maxLength

}

enter image description here

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете использовать textFieldShouldBeginEditing, чтобы проверить и разрешить / отменить textField, чтобы начать редактирование следующим образом

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {         
    return true // edit the condition according to your requirement
}

Редактировать

Если вы хотите проверить и разрешитьесли предыдущее текстовое поле имеет значение или нет, вы можете сделать что-то вроде этого, просто поместите все текстовое поле в массив с последовательностью от одного до т.

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    let textfields : [UITextField] = [textfield1,textfield2,textfield3] // just to demonstrate
    if (textField == textfield1) { return true }
    var previousTextfield : UITextField?
    for textfield in textfields{
        if let pTextfiled = previousTextfield,let value = pTextfiled.text{
            return value.isEmpty ? false : (textfield == textField)
        }
        previousTextfield = textfield
    }
    return false
}

Примечание: я не проверял этоКод только что добавил ответ в соответствии с требованием, дайте мне знать, если это то, что вы хотели или что-то еще.

Спасибо.

...