有时,我们希望确保用户仅输入限定范围的字符。例如:你可能希望创建一个不处理字母的数值型文本字段,
尽管你可以使用谓词通过正则表达式(NSPredicate 类的MATCH 运算符 支持正则表达式值) 测试最终输入,
但对于已筛选数据,依据规则集检查输入的每个新字符更容易些。
在输入字符时,UITextField委托可以捕获这些字符,并不决定是否将该字符添加到活动文本字段中。可选的
textField : shouldChangeCharactersInRange:replacementString: 委托方法返回一个值:YES或NO, 前者允许有
新字符输入,而后者不允许。在实践中,这时逐字符运行的。每次用户点击键盘后调用该方法。
所以,以下仅限字母文本的输入,数值型输入,带小数点的数值型输入,以及字母数字混合输入。
其中,第三钟输入类型。即带小数点的数字,使用一点小技巧来确保只可以输入一个小数点。如果在相关文本字段中
找到点(.)它将接受的字符从带点切换到不带点。是的,你可以使用粘贴操作来暗中解决这个问题。尽管用户不太可
能使用这个种方法。
代码: 筛选用户文本输入
#define SEGMENT [(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex]
#define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
#define NUMBERS @"0123456789"
#define ALPHANUM @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
#define NUMBERSPERIOD @"0123456789."
@interface TestBedViewController : UIViewController <UITextFieldDelegate>
@end
@implementation TestBedViewController
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *cs;
switch (SEGMENT)
{
case 0:
cs = [[NSCharacterSet characterSetWithCharactersInString:ALPHA] invertedSet];
break;
case 1:
cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];
break;
case 2:
cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];
if ([textField.text rangeOfString:@"."].location == NSNotFound)
cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERSPERIOD] invertedSet];
break;
case 3:
cs = [[NSCharacterSet characterSetWithCharactersInString:ALPHANUM] invertedSet];
break;
default:
break;
}
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
BOOL basicTest = [string isEqualToString:filtered];
// Add any predicate testing here
return basicTest;
}
- (void) segmentChanged: (UISegmentedControl *) seg
{
[(UITextField *)[self.view viewWithTag:101] setText:@""];
}
- (void) viewDidLoad
{
self.navigationController.navigationBar.tintColor = COOKBOOK_PURPLE_COLOR;
self.title = @"Keyboard Dismissal";
// Text field defined in interface builder
[(UITextField *)[self.view viewWithTag:101] setDelegate:self];
// Add segmented control with entry options
UISegmentedControl *seg = [[UISegmentedControl alloc] initWithItems:[@"ABC 123 2.3 A2C" componentsSeparatedByString:@" "]];
seg.segmentedControlStyle = UISegmentedControlStyleBar;
seg.selectedSegmentIndex = 0;
[seg addTarget:self action:@selector(segmentChanged:) forControlEvents:UIControlEventValueChanged];
self.navigationItem.titleView = seg;
[seg release];
}
@end