为什么textfield委托不能以编程方式在textfield上使用设置文本?

时间:2019-06-25 17:52:12

标签: swift delegates textfield xib

我正在以编程方式在文本字段中设置文本,该文本是生日,但是委托不起作用,如果我使用本机键盘,则委托可以工作,但是如果我以编程方式在文本字段上设置文本,则委托不起作用< / p>

我正在使用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()是因为我不希望本机键盘出现,而只显示光标

我该如何解决?

我尝试使用set insertText设置,但不起作用:(

1 个答案:

答案 0 :(得分:1)

Delegate方法仅响应用户输入。您需要在设置文本后手动调用委托方法。

正如我在问题中看到的那样,您不想显示用于输入出生日期的默认键盘。我建议您使用 UIDatePicker代替键盘,这样您就无需自己进行验证。此外,您还可以借助UIDatePicker指定最小和最大年龄限制。关于如何实施。 https://stackoverflow.com/a/32153107/2299040是很棒的帖子