UITextField 在 Swift 中设置最大字符长度

Posted

技术标签:

【中文标题】UITextField 在 Swift 中设置最大字符长度【英文标题】:UITextField setting maximum character length in Swift 【发布时间】:2018-03-12 18:34:58 【问题描述】:

如何覆盖此 UITextField 函数,以限制最大字符数?

override func shouldChangeText(in range: UITextRange, replacementText text: String) -> Bool 


我对堆栈进行了一些研究,但我只能找到这个函数(见下文)。首先,我看不出这是如何覆盖的,其次,它使用 NSRange 作为我有 UITextRange 的参数。如何实施?谢谢

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
                replacementString string: String) -> Bool 
        let currentString: NSString = textField.text! as NSString
        let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
        return newString.length <= 4
    

我失败的尝试:

override func shouldChangeText(in range: UITextRange, replacementText text: String) -> Bool 
        let currentString: NSString = self.text! as NSString
        let newString: NSString = currentString.replacingCharacters(in: range, with: text) as NSString
        return newString.length <= 4
    

错误:无法将“UITextRange”类型的值转换为预期的参数类型“NSRange”(又名“_NSRange”)

【问题讨论】:

【参考方案1】:

您可以继承 UITextField 并为 UIControlEvents editingChanged 添加一个目标。在选择器方法中,您可以使用集合方法前缀来限制添加到文本字段文本属性的字符,如下所示:

import UIKit
class LimitedLengthField: UITextField 
    var maxLength: Int = 10
    override func willMove(toSuperview newSuperview: UIView?) 
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        editingChanged()
    
    @objc func editingChanged() 
        text = String(text!.prefix(maxLength))
    


您可以通过编程方式或使用界面构建器添加自定义文本字段:

import UIKit

class ViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()
        let limitedLenghtField = LimitedLengthField(frame: CGRect(origin: CGPoint(x: 50, y: 50), size: CGSize(width: 200, height: 50)))
        limitedLenghtField.text = "123456789012345"
        view.addSubview(limitedLenghtField)
    

【讨论】:

有趣的是,您还回答了我的另一个问题,即如何在#selector 中添加带参数的函数。 哪一个?可以发一下链接吗? 您的建议工作正常,我很高兴现在有一个有效的答案。但是,我仍然想知道如何更改从 SO 复制的代码以匹配 UITextField 类中的 shouldChangeText 函数。我想我面临的唯一问题是一个使用 UITextRange,另一个使用 NSRange,它们不匹配。在编辑中查看我失败的尝试。我得到的错误是“无法将'UITextRange'类型的值转换为预期的参数类型'NSRange'(又名'_NSRange')” 对不起,我现在才看到你的评论。我不知道复选标记。我现在做了检查并投票,谢谢。

以上是关于UITextField 在 Swift 中设置最大字符长度的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITextField 子类中设置 UITextField 的属性

如何在 XCTest 中设置 UItextfield 文本

是否可以在 UITextField 中设置宽空间

如何在一个 UITextField 中设置两个不同的 NSUserDefaults

iOS开发中设置UITextField的占位文字的颜色,和光标的颜色

如何在 UITextField 中设置 placeHolder / 用户文本和左边框之间的距离