ios - 设置 UITextField 的最大字符长度

当我加载 UIView 时,如何在 iPhone SDK 上设置 UITextField 中的最大字符数?

最佳答案

虽然 UITextField 类没有最大长度属性,但通过设置文本字段的 delegate 并实现以下委托(delegate)方法来获得此功能相对简单:

Objective-C

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }
        
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

swift

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
    let currentCharacterCount = textField.text?.count ?? 0
    if range.length + range.location > currentCharacterCount {
        return false
    }
    let newLength = currentCharacterCount + string.count - range.length
    return newLength <= 25
}

在文本字段更改之前,UITextField 会询问代理是否应该更改指定的文本。文本字段此时没有改变,所以我们获取它的当前长度和我们正在插入的字符串长度(通过粘贴复制的文本或使用键盘输入单个字符)减去范围长度。如果该值过长(本例中超过 25 个字符),则返回 NO 以禁止更改。

在文本字段末尾输入单个字符时,range.location 将是当前字段的长度,而 range.length 将为 0,因为我们不会替换/删除任何东西。插入到文本字段的中间只是意味着不同的range.location,而粘贴多个字符只是意味着string中有多个字符。

删除单个字符或剪切多个字符由具有非零长度和空字符串的 range 指定。替换只是一个非空字符串的范围删除。

关于崩溃的“撤消”错误的说明

正如评论中提到的,UITextField 存在一个可能导致崩溃的错误。

如果您粘贴到该字段中,但您的验证实现阻止了粘贴,则粘贴操作仍会记录在应用程序的撤消缓冲区中。如果您随后触发撤消(通过摇晃设备并确认撤消),UITextField 将尝试用空字符串替换它认为它粘贴到自身的字符串.这将崩溃,因为它从未实际上 将字符串粘贴到自身中。它会尝试替换字符串中不存在的部分。

幸运的是,您可以保护 UITextField 不会像这样杀死自己。您只需要确保它建议替换的范围 确实 存在于其当前字符串中。这就是上面的初始健全性检查所做的。

swift 3.0,复制和粘贴工作正常。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

希望对你有帮助。

https://stackoverflow.com/questions/433337/

相关文章:

ios - 如何将 UIButton 的标题设置为左对齐?

ios - @import 与 #import - iOS 7

objective-c - 如何检查 NSDictionary 或 NSMutableDiction

objective-c - 如何打印出方法名称和行号并有条件地禁用 NSLog?

objective-c - 如何将百分号添加到 NSString

objective-c - 如何迭代 NSArray?

objective-c - "__block"关键字是什么意思?

objective-c - 如何在 Xcode 4 中设置 NSZombieEnabled?

ios - AVFoundation, captureStillImageAsynchronousl

objective-c - 类方法和实例方法有什么区别?