Действие Backspace текстового поля определить, когда текстовое поле пусто? - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь создать текстовое поле otp, используя пять текстовых полей. Все работает нормально, если вы добавляете top, но возникает проблема, когда пользователь пытается добавить пустое текстовое поле и пытается вернуться, и не было вызова метода делегата UItextfiled, который я ужедобавлено.

Я пробовал это: -

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

    let  char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
    let isBackSpace = strcmp(char, "\\b")

    if (isBackSpace == -92) {
        println("Backspace was pressed")
    }
    return true
}

, но вызывается, когда текстовое поле не пустое.

Например: -

На экране нижеshot add 1 и в двух разных текстовых полях, а третье пустое, но когда я пытаюсь вернуться назад, нужно перейти во второе текстовое поле (третье поле пустое), это то, с чем я столкнулся с проблемой со своей стороны.

Спасибо

enter image description here

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Вы можете присвоить тегу свое текстовое поле в такой последовательности, как 101,102,103,104,105.

при нажатии на клавишу Backspace.проверьте, что длина строки равна 0. затем переходите к textfield.tag - 1 до тех пор, пока не получите первое текстовое поле. Например, если вы находитесь в текстовом поле 102, перейдите в текстовое поле 102-1 = 101.

То же, что и при вводе любогосимвол переходить к следующему текстовому полю, пока не дойдете до последнего текстового поля, как если бы вы находились в текстовом поле 102, а затем перейти к текстовому полю 102 + 1 = 103.

Вы можете использовать (self.view.viewWithTag(yourTag) as? UITextField)?.becomeFirstResponder()

У меня нет системысо мной так не смог выложить код

0 голосов
/ 07 декабря 2018

, за которыми следуют @Marmik Shah и @Prashant Tukadiya, здесь я добавляю свой ответ, для быстрого ответа я взял некоторый код из здесь

шаг 1:

создайте IBOutletCollection для всех ваших текстовых полей, а также не забудьте установить тег во всех текстовых полях в порядке последовательности, например, [1,2,3,4,5,6]

class ViewController: UIViewController{

@IBOutlet var OTPTxtFields: [MyTextField]! // as well as set the tag for textfield in the sequence order

 override func viewDidLoad() {
    super.viewDidLoad()

    //change button color and other options
    OTPTxtFields.forEach { $0.textColor  = .red;  $0.backspaceTextFieldDelegate = self }
    OTPTxtFields.first.becomeFirstResponder()
}

шаг 2:

на текущей странице Метод делегата UITextField

extension ViewController : UITextFieldDelegate, MyTextFieldDelegate {

func textFieldDidEnterBackspace(_ textField: MyTextField) {
    guard let index = OTPTxtFields.index(of: textField) else {
        return
    }

    if index > 0 {
        OTPTxtFields[index - 1].becomeFirstResponder()
    } else {
        view.endEditing(true)
    }
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string)


    if newString.count < 2 && !newString.isEmpty {
        textFieldShouldReturnSingle(textField, newString : newString)
      //  return false
    }

     return newString.count < 2 || string == ""
    //return true
}
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if action == #selector(copy(_:)) || action == #selector(paste(_:)) {
        return false
    }

    return true
}
func textFieldShouldReturnSingle(_ textField: UITextField, newString : String)
{
    let nextTag: Int = textField.tag + 1
    textField.text = newString
    let nextResponder: UIResponder? = textField.superview?.viewWithTag(nextTag)
    if let nextR = nextResponder
    {
        // Found next responder, so set it.

        nextR.becomeFirstResponder()
    }
    else
    {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
        callOTPValidate()
    }
}

}

Шаг 3:

создать класс текстового поля для доступа к обратной функции

class MyTextField: UITextField {
weak var myTextFieldDelegate: MyTextFieldDelegate?

override func deleteBackward() {
    if text?.isEmpty ?? false {
        myTextFieldDelegate?.textFieldDidEnterBackspace(self)
    }

    super.deleteBackward()
}

}

protocol MyTextFieldDelegate: class {
func textFieldDidEnterBackspace(_ textField: MyTextField)
}

step - 4

наконец следовать @MarmikШах ответит за пользовательский класс для вашего UITextField

Шаг 5

получить значения из каждого использования текстового поляэто

func callOTPValidate(){
    var texts:  [String] = []
    OTPTxtFields.forEach {  texts.append($0.text!)}
    sentOTPOption(currentText: texts.reduce("", +))

}

  func  sentOTPOption(currentText: String)   {
    print("AllTextfieldValue == \(currentText)")
  }
0 голосов
/ 07 декабря 2018

Вы можете переопределить функцию deleteBackward()
Создать новый класс, который наследует UITextField и триггер и событие EditingEnd.

class MyTextField: UITextField {
    override func deleteBackward() {
        super.deleteBackward()
        print("Backspace");
        self.endEditing(true);
    }
}

Затем в вашей раскадровке добавьте пользовательский класс для UITextField

Далее в контроллере представления в действии editEnd вы можете переключить текстовое поле.Чтобы это работало, вам нужно установить значение тега для каждого вашего текстового поля.
Например, у вас есть два текстовых поля, tfOne и tfTwo.
tfOne.tag = 1; tfTwo.tag = 2
Теперь, если в данный момент вы редактируете tfTwo и нажата клавиша Backspace, тогда вы устанавливаете текстовое поле для редактирования на tfOne

class ViewController: UIViewController {
    @IBOutlet weak var tfOne: MyTextField!
    @IBOutlet weak var tfTwo: MyTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func editingEnded(_ sender: UITextField) {
        // UITextField editing ended
        if(sender.tag == 2) {
            self.tfOne.becomeFirstResponder();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...