Kev*_* L. 7 iphone cocoa-touch uitextfield uitextview iphone-sdk-3.0
限制直接输入UITextView或UITextField的字符串的问题已在SO上解决:
但是现在使用OS 3.0复制和粘贴成为一个问题,因为上述SO问题中的解决方案不会阻止粘贴其他字符(即,您不能在使用上述解决方案配置的字段中键入超过10个字符但是您可以轻松地将100个字符粘贴到同一个字段中).
有没有办法防止直接输入字符串和粘贴字符串溢出?
Kev*_* L. 10
我能够通过符合UITextViewDelegate协议中的textViewDidChange:方法来限制输入和粘贴的文本.
- (void)textViewDidChange:(UITextView *)textView
{
if (textView.text.length >= 10)
{
textView.text = [textView.text substringToIndex:10];
}
}
Run Code Online (Sandbox Code Playgroud)
但我仍然认为这种丑陋的黑客攻击,似乎Apple应该提供UITextFields和UITextViews的某种"maxLength"属性.
如果有人知道更好的解决方案,请告诉我们.
根据我的经验,只需实现委托方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Run Code Online (Sandbox Code Playgroud)
适用于粘贴.整个粘贴的字符串在replacementString:参数中出现.只检查它的长度,如果它长于你的最大长度,那么只需从这个委托方法返回NO.这导致无法粘贴任何内容.或者你可以像早期的答案建议那样对它进行子串,但如果它太长,这可以防止粘贴,如果这是你想要的.
在textViewDidChange中插入文本后更改文本:如果用户在粘贴后按"撤消",则会导致应用程序崩溃.
我玩了很多,并得到了一个有效的解决方案.基本上逻辑是,如果总长度大于最大字符,则不允许粘贴,检测溢出的量并仅插入部分字符串.
使用此解决方案,您的粘贴板和撤消管理器将按预期工作.
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSInteger newLength = textView.text.length - range.length + text.length;
if (newLength > MAX_LENGTH) {
NSInteger overflow = newLength - MAX_LENGTH;
dispatch_async(dispatch_get_main_queue(), ^{
UITextPosition *start = [textView positionFromPosition:nil offset:range.location];
UITextPosition *end = [textView positionFromPosition:nil offset:NSMaxRange(range)];
UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
[textView replaceRange:textRange withText:[text substringToIndex:text.length - overflow]];
});
return NO;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
您上面链接的第一个问题的答案之一应该有效,即使用类似的东西
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(limitTextField:) name:@"UITextFieldTextDidChangeNotification" object:myTextField];
Run Code Online (Sandbox Code Playgroud)
监视 UITextField 中文本的更改并在适当时缩短它。
| 归档时间: |
|
| 查看次数: |
12056 次 |
| 最近记录: |