要限制文本视图的可能输入字符,请实现文本视图
像这样的委托:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
static NSString *validChars = @"ABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890\n";
NSCharacterSet *validSet = [NSCharacterSet characterSetWithCharactersInString:validChars];
if ([[text stringByTrimmingCharactersInSet:validSet] length] > 0)
return NO;
return YES;
}
validChars 中的\n 用于返回键(您可能希望也可能不希望允许)。
按照 cmets 的建议,您可以将小写字母转换为大写字母
自动:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
text = [text uppercaseString];
static NSString *validChars = @"ABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890\n";
NSCharacterSet *validSet = [NSCharacterSet characterSetWithCharactersInString:validChars];
if ([[text stringByTrimmingCharactersInSet:validSet] length] > 0)
return NO;
textView.text = [textView.text stringByReplacingCharactersInRange:range withString:text];
return NO;
}
要允许其他语言的大写字母和数字,请更改
validSet 的定义为
NSMutableCharacterSet *validSet = [NSMutableCharacterSet uppercaseLetterCharacterSet];
[validSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
[validSet formUnionWithCharacterSet:[NSCharacterSet newlineCharacterSet]];
由于文本视图委托被频繁调用,您可以通过以下方式改进它
使用 GCD 只计算一次有效字符集:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
static NSCharacterSet *validSet;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSMutableCharacterSet *tmpSet = [NSMutableCharacterSet uppercaseLetterCharacterSet];
[tmpSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
[tmpSet formUnionWithCharacterSet:[NSCharacterSet newlineCharacterSet]];
validSet = [tmpSet copy];
});
text = [text uppercaseString];
if ([[text stringByTrimmingCharactersInSet:validSet] length] > 0)
return NO;
textView.text = [textView.text stringByReplacingCharactersInRange:range withString:text];
return NO;
}