加载UIView
时,如何在iPhone SDK的UITextField
设置最大字符数? 函数
这应该足以解决问题(将4替换为您想要的限制)。 只要确保在IB中添加委托便可。 spa
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; return (newString.length<=4); }
一般,您有多个长度不一样的输入字段。 code
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { int allowedLength; switch(textField.tag) { case 1: allowedLength = MAXLENGTHNAME; // triggered for input fields with tag = 1 break; case 2: allowedLength = MAXLENGTHADDRESS; // triggered for input fields with tag = 2 break; default: allowedLength = MAXLENGTHDEFAULT; // length default when no tag (=0) value =255 break; } if (textField.text.length >= allowedLength && range.length == 0) { return NO; // Change not allowed } else { return YES; // Change allowed } }
为了使它能够剪切和粘贴任何长度的字符串,我建议将函数更改成: ci
#define MAX_LENGTH 20 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSInteger insertDelta = string.length - range.length; if (textField.text.length + insertDelta > MAX_LENGTH) { return NO; // the new string would be longer than MAX_LENGTH } else { return YES; } }
其余答案不能解决用户能够从剪贴板粘贴长字符串的状况。 若是我粘贴了一个长字符串,则应该将其截短但要显示出来。 在您的表明中使用此命令: 字符串
static const NSUInteger maxNoOfCharacters = 5; -(IBAction)textdidChange:(UITextField * )textField { NSString * text = textField.text; if(text.length > maxNoOfCharacters) { text = [text substringWithRange:NSMakeRange(0, maxNoOfCharacters)]; textField.text = text; } // use 'text' }
虽然UITextField
类没有max length属性,可是经过设置文本字段的delegate
并实现如下委托方法来得到此功能相对简单: input
目标C string
- (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; }
迅速 it
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
以禁止更改。 io
在文本字段的末尾键入单个字符时, range.location
将是当前字段的长度,而range.length
将是0,由于咱们没有替换/删除任何内容。 插入文本字段的中间仅表示不一样的range.location
,而粘贴多个字符仅表示string
包含多个字符。 event
删除单个字符或剪切多个字符由长度不为零的range
和空字符串指定。 替换只是使用非空字符串的范围删除。
如评论中所述, UITextField
存在一个错误,可能致使崩溃。
若是您粘贴到该字段中,可是您的验证明现阻止粘贴,则粘贴操做仍会记录在应用程序的撤消缓冲区中。 若是随后触发撤消操做(经过摇动设备并确认撤消操做),则UITextField
将尝试用空字符串替换它认为粘贴至其自身的字符串。 这将崩溃,由于它从未真正将字符串粘贴到自身中。 它将尝试替换不存在的字符串的一部分。
幸运的是,您能够像这样保护UITextField
避免杀死本身。 您只须要确保它建议替换的范围确实存在于当前字符串中便可。 这就是上面的初始完整性检查所作的。
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 }
但愿对您有帮助。