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

UITextField设置Swift中的最大字符长度,swift,count,uitextfield,character-limit,Swift,Count,Uitextfield,Character Limit,如何重写此UITextField函数,使其限制最大字符数 override func shouldChangeText(in range: UITextRange, replacementText text: String) -> Bool { } 我对堆栈做了一些研究,但我能找到的只是这个函数(见下文)。首先,我看不出这怎么可能是一个覆盖,其次,它使用NSRange作为参数,其中我有uitextange。如何实现这一点?谢谢 func textField(_ textField: U

如何重写此UITextField函数,使其限制最大字符数

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

}
我对堆栈做了一些研究,但我能找到的只是这个函数(见下文)。首先,我看不出这怎么可能是一个覆盖,其次,它使用NSRange作为参数,其中我有uitextange。如何实现这一点?谢谢

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
    }
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,
替换字符串:字符串)->Bool{
让currentString:NSString=textField.text!作为NSString
让newString:NSString=currentString.replacingCharacters(在:范围内,带:字符串)作为NSString
return newString.length Bool{
让currentString:NSString=self.text!作为NSString
让newString:NSString=currentString.replacingCharacters(在:范围内,带:文本)作为NSString

return newString.length您可以将UITextField子类化,并为UIControlEvents editingChanged添加目标。在选择器方法内,您可以使用collection method prefix限制添加到textfield文本属性的字符,如下所示:

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)
    }
}

有趣的是,你还回答了我的另一个问题,那就是如何在#选择器中添加一个带有参数的函数。哪一个?你能发布链接吗?你的建议很好,我很高兴现在有了一个有效的答案。但是我仍然想知道如何更改我复制的代码以匹配shouldChangeText函数UITextField类中的错误。我想我面临的唯一问题是,一个使用uitextange,另一个使用NSRange,但不匹配。请参阅编辑中失败的尝试。我得到的错误是“无法将类型为‘uitextange’的值转换为预期的参数类型‘NSRange’(又称‘NSRange’)”对不起,我刚刚看到你的评论。我不知道复选标记。我现在进行了检查和投票。谢谢。
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)
    }
}