欢迎访问宙启技术站
智能推送

IOS 开发之 UITextField限制字数的方法

发布时间:2023-05-17 07:40:58

在 iOS 开发中,UITextField 是常用的 UI 元素之一,用于在用户输入文本时显示一个文本框。为了确保用户输入的数据符合我们的要求,有时需要限制用户输入的字符数量。下面介绍几种实现 UITextField 限制字数的方法。

1. 使用 UITextFieldDelegate 协议

UITextFieldDelegate 协议中有一个代理方法 textField(_:shouldChangeCharactersIn:replacementString:),可以在每次用户输入时被调用,我们可以在该方法中判断输入文字的长度是否超出限制。

class ViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        textField.delegate = self
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if let text = textField.text,
            let textRange = Range(range, in: text) {
            let updatedText = text.replacingCharacters(in: textRange, with: string)
            return updatedText.count <= 10 // 限制输入字符数为 10
        }
        return true
    }
}

在上面的例子中,我们设置了 textField.delegate 为当前视图控制器,并实现了 textField(_:shouldChangeCharactersIn:replacementString:) 方法。在该方法中,我们首先判断当前 TextField 是否有文本,以及用户输入的字符范围,然后计算更新后文本的长度,最后返回长度是否不大于 10。

2. 使用 addTarget 方法

UITextField 还提供了 addTarget 方法,可以监听输入框中文本的变化。我们可以在其回调方法中判断文本的长度是否超出限制。

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
    }
    
    @objc func textFieldDidChange(_ textField: UITextField) {
        guard let text = textField.text else { return }
        if text.count > 10 {
            textField.deleteBackward() // 删除超出的字符
        }
    }
}

在上面的例子中,我们使用 addTarget 方法设置了文本框的值改变回调,即 textFieldDidChange(_:) 方法。在该方法中,我们判断文本长度是否超出限制,若超出则使用 deleteBackward() 方法删除多余字符。

3. 使用继承自 UITextField 的子类

如果我们需要限制的字符数很多 UITextField,可以定义一个继承自 UITextField 的子类,实现自定义的文本框行为。

class LimitedTextField: UITextField {

    var maxLength: Int?
    
    override func awakeFromNib() {
        super.awakeFromNib()
        delegate = self
    }

}

extension LimitedTextField: UITextFieldDelegate {

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if let maxLength = maxLength,
            let text = textField.text,
            let textRange = Range(range, in: text) {
            let updatedText = text.replacingCharacters(in: textRange, with: string)
            return updatedText.count <= maxLength
        }
        return true
    }

}

在上面的例子中,我们定义了一个名为 LimitedTextField 的子类,实现了 UITextFieldDelegate 协议中的 textField(_:shouldChangeCharactersIn:replacementString:) 方法。我们在 awakeFromNib 方法中设置了自身的代理为 self,这样文本框输入时就会被限制字符数量。同时,我们增加了 maxLength 属性,可以通过该属性设置限制输入的字符数。继承自 LimitedTextField 的文本框可以直接使用 maxLength 属性进行字符数量限制。

通过以上三种方法,我们可以实现对 UITextField 的字符数量限制,确保用户输入符合我们的要求。可以根据实际需求选择适合自己的方法,用于开发 iOS 应用中的输入框。