虽然UITextField
类没有最大长度属性,通过设置文本字段的值来获得此功能相对简单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 会询问委托是否指定的文本should被改变。此时文本字段尚未更改,因此我们获取它的当前长度和我们要插入的字符串长度(通过粘贴复制的文本或使用键盘键入单个字符)减去范围长度。如果该值太长(本例中超过 25 个字符),则返回NO
来禁止改变。
在文本字段末尾输入单个字符时,range.location
将是当前字段的长度,并且range.length
将为 0,因为我们不会替换/删除任何内容。插入到文本字段的中间只是意味着不同的range.location
,粘贴多个字符只是意味着string
其中有多个字符。
删除单个字符或剪切多个字符由range
具有非零长度和空字符串。替换只是用非空字符串进行范围删除。
关于崩溃的“撤消”错误的说明
正如评论中提到的,存在一个错误UITextField
这可能会导致崩溃。
如果您粘贴到字段中,但验证实现阻止了粘贴,则粘贴操作仍会记录在应用程序的撤消缓冲区中。如果您随后触发撤消(通过摇动设备并确认撤消),UITextField
将尝试替换该字符串thinks它用空字符串粘贴到自身中。这会崩溃,因为它永远不会actually将字符串粘贴到自身中。它将尝试替换字符串中不存在的部分。
幸运的是,您可以保护UITextField
免得像这样自杀。您只需要确保它建议替换的范围does存在于其当前字符串中。这就是上面的初始健全性检查的作用。
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
}
希望对您有帮助。