почему делегат текстового поля не работает с настройкой текста программно в текстовом поле? - PullRequest
0 голосов
/ 25 июня 2019

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

Я пользуюсь swift 4.2

import UIKit

class userBirthdateViewController: UIViewController, UITextFieldDelegate, NumberCalculable {

    @IBOutlet weak var messageBirthdate: UILabel!
    @IBOutlet weak var inputBirthdate: UITextField!
    @IBOutlet weak var keyboardView: keyboardView!


    override func viewDidLoad() {
        super.viewDidLoad()
        messageBirthdate.text = "Debes tener 18 años cumplidos para\npoder abrir una cuenta Flink"
        inputBirthdate.attributedPlaceholder = NSAttributedString(string: "DD-MM-AAAA", attributes: [NSAttributedString.Key.foregroundColor: UIColor.gray])
        self.inputBirthdate.inputView = UIView()
        self.inputBirthdate.becomeFirstResponder()
        keyboardView.delegate = self
        inputBirthdate.delegate = self
        // Do any additional setup after loading the view.
    }

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

            // check the chars length dd -->2 at the same time calculate the dd-MM --> 5
            if (inputBirthdate?.text?.count == 2) || (inputBirthdate?.text?.count == 5) {
                //Handle backspace being pressed
                if !(string == "") {
                    // append the text
                    inputBirthdate?.text = (inputBirthdate?.text)! + "-"
                }
            }
            // check the condition not exceed 9 chars
            return !(textField.text!.count > 9 && (string.count ) > range.length)
        }
        else {
            return true
        }
    }

    @IBAction func probe(_ sender: Any) {

    }

    func addNumber(_ number: Int) {
        if number != -1
        {
            inputBirthdate.insertText("\(number)")
        }
        else
        {
            if !inputBirthdate.text!.isEmpty
            {
                inputBirthdate.text?.removeLast()
            }
        }
    }
}

Я ожидаю, что текстовое поле отвечает как собственная клавиатура, единственное отличие состоит в том, что я программно устанавливаю текст в текстовое поле.

Я использую эту строку self.inputBirthdate.inputView = UIView (), потому что я не хочу, чтобы появилась встроенная клавиатура, а только курсор

как я могу решить эту проблему?

Я пытался установить setText, но не работает: (

1 Ответ

1 голос
/ 25 июня 2019

Методы делегатов отвечают только на ввод данных пользователем. вам нужно вручную вызывать методы делегата после установки текста.

Как я вижу в вашем вопросе вы не хотите отображать клавиатуру по умолчанию для ввода даты рождения. Я бы посоветовал вам использовать UIDatePicker вместо клавиатуры , так что вам не нужно делать проверки самостоятельно. Кроме того, вы также можете указать минимальный и максимальный возрастной предел с помощью UIDatePicker. О том, как это реализовать. https://stackoverflow.com/a/32153107/2299040 отличный пост

...