为啥文本字段委托不能以编程方式在文本字段上使用设置文本?

Posted

技术标签:

【中文标题】为啥文本字段委托不能以编程方式在文本字段上使用设置文本?【英文标题】:why the textfield delegate not works with a setting text programmatically on textfield?为什么文本字段委托不能以编程方式在文本字段上使用设置文本? 【发布时间】:2019-06-25 17:52:12 【问题描述】:

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

我正在使用 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】:

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

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

【讨论】:

是的,但我的“老板”想要一个自定义键盘,我知道日期选择器可以轻松完成任务,但这就是生活。 :( @AndresGomez 然后手动调用代理。当您从自定义键盘获取事件时,请调用这些委托方法

以上是关于为啥文本字段委托不能以编程方式在文本字段上使用设置文本?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 xib 上使用自动布局创建的两个文本字段之间添加 uiview

将值从选择器视图设置为文本字段,而无需以编程方式全局快速声明 uitextfield

如何以编程方式使用自动调整大小掩码为固定左边距和灵活右边距设置文本字段

以编程方式进入编辑模式 TextField

以编程方式处理 uiwebview 中的文本字段

如何以编程方式在单元格内创建文本字段或标签?