设置 `UITextView` 和 `UITextField` 的最大字符数限制。

46
我希望在UITextViewUITextField中设置最多允许输入的字符数。 然后会在一个小标签上显示这个数字(为用户提供参考,类似Twitter)。

你正在检查文本的当前长度,而不是即将变成的长度。 - rmaddy
https://dev59.com/33RC5IYBdhLWcg3wCMc6#1773257 - Adrian
我点击了我添加的链接,在ViewDidLoad中添加了那段代码,并将“UITextField”替换为“myMessageObjectLabel”,这样做对吗?现在我得到了这个错误:“使用未声明的类型'myMessageObjectLabel'”。我现在正在使用Swift 1.2,可能是问题所在吗? - biggreentree
10个回答

122

更新 Swift 4.X

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let newText = (textView.text as NSString).replacingCharacters(in: range, with: text)
    let numberOfChars = newText.count
    return numberOfChars < 10    // 10 Limit Value
}

试试这个:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    let newText = (textView.text as NSString).stringByReplacingCharactersInRange(range, withString: text)
    let numberOfChars = newText.characters.count // for Swift use count(newText)
    return numberOfChars < 10;
}

这是正确的,但为什么变量被命名为 numberOfLines,当它实际上是字符数? - rmaddy
是的,这是正确的,我忘记了行数。 - William Kinaan
@WilliamKinaan 几行代码?问题中没有任何关于限制代码行数的内容。 - rmaddy
2
最后一行不应该是return numberOfChars <= 10;吗?(小于号应该是小于等于号)? - Roberto
3
如果您想允许用户在“超出限制”时删除字符(如果您降低字符限制并且用户正在编辑旧的(更长的)文本),请添加一个保护语句... guard !text.isEmpty else { return true } - Swany
显示剩余10条评论

38

SWIFT 4

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
     let newText = (textView.text as NSString).replacingCharacters(in: range, with: text)
     return newText.count < 10
}

在Swift 4中,它是这样的:let numberOfChars = newText.count - Lance Samaria
1
@LanceSamaria 谢谢,我已经更新了我的答案到Swift 4,因为Swift 3已经不再相关了。 - Yaroslav Dukal

12

Swift 4:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
  let newText = (textView.text as NSString).replacingCharacters(in: range, with: text)
  return newText.count <= 70
}

9

试试这个:

 func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    print("chars \(textView.text.characters.count) \( text)")

    if(textView.text.characters.count > 20 && range.length == 0) {
        print("Please summarize in 20 characters or less")
        return false;
    }

    return true;
}

8

Swift 3.0

只需重写这个UITextFieldDelegate函数,设置所需的characterLimit变量,您就可以开始了:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
{        
        let characterLimit = 5
        let newText = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
        let numberOfChars = newText.characters.count
        return numberOfChars < characterLimit
}

5

Swift 5 更新

提供最直接的结果

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    return range.location < 140 // limit to 140 chars
}

如果允许粘贴文本,这将不起作用。 - Torsten B

3

Swift 4 , Xcode 9.1 GM

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    return textView.text.count + (text.count - range.length) <= 200
}

调整帧是用来做什么的? - Yaroslav Dukal

3

Swift 4/ Xcode 9.1

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

    let currentText = textView.text ?? ""
    guard let stringRange = Range(range, in: currentText) else { return false }
    let changedText = currentText.replacingCharacters(in: stringRange, with: text)
    return changedText.count <= 399 // Pass your character count here 
}

2

添加支持通过maxLength剪切文本并避免UNDO操作崩溃:

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if let maxLength = maxLength {
        let maxReplacementLength = min(range.length, maxLength - range.location)
        let replacementRange = NSRange(location: range.location, length: maxReplacementLength)
        let result = NSString(string: (textView.text ?? "")).replacingCharacters(in: replacementRange, with: text)
        
        if result.count <= maxLength && range.length <= maxLength - range.location  {
            return true
        }
        textView.text = String(result[..<result.index(result.startIndex, offsetBy: min(result.count, maxLength))])
        
        return false
    }
    
    return true
}

2

Swift 5

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    var newText = textView.text!
    newText.removeAll { (character) -> Bool in
        return character == " " || character == "\n"
    }

    return (newText.count + text.count) <= 40
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接