大家好,
我正在开发一个项目,当我们点击文本字段时,不应弹出需求键盘,因为我们正在为特定文本字段创建数字键盘,并且我们已成功通过...
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
if (textField == dateFld) {
UIView* dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
textField.inputView = dummyView;
}
}
现在我的问题是,我想验证该文本字段只接受特定格式和有限数量的输入,但我无法这样做,因为当我们禁用键盘弹出以下时,没有调用该方法我的代码验证文本域。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
//Format Date of Birth YYYY-MM-DD
if(textField == dateFld)
{
if ((dateFld.text.length == 4)||(dateFld.text.length == 7))
//Handle backspace being pressed
if (![string isEqualToString:@""])
dateFld.text = [dateFld.text stringByAppendingString:@"-"];
return !([textField.text length]>9 && [string length] > range.length);
}
else
return YES;
}
请帮助我解决这个问题或其他任何方式。
由于
答案 0 :(得分:0)
我想验证该文本字段只接受特定格式和有限数量的输入:
if(textField == dateFld){
NSCharacterSet* numberCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789+"];
for (int i = 0; i < [string length]; ++i)
{
unichar c = [string characterAtIndex:i];
if (![numberCharSet characterIsMember:c])
{
return NO;
}
}
//Format Date of Birth YYYY-MM-DD
if([textField.text length] == 4) {
textField.text=[NSString stringWithFormat:@"%@-",textField.text];
}else if([textField.text length]==6){
textField.text=[NSString stringWithFormat:@"%@-",textField.text];
}else if([textField.text length]==8){
textField.text=[NSString stringWithFormat:@"%@",textField.text];
}
NSLog(@"value %@",textField.text);
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 13) ? NO : YES;
}
}
这对我来说很好。
答案 1 :(得分:0)
我会做这样的事情:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSError *_error = nil;
NSRegularExpression *_regularExpression = [NSRegularExpression regularExpressionWithPattern:@"^\\d{0,4}-{0,1}$|^\\d{4}-{1}\\d{0,2}-{0,1}$|^\\d{4}-{1}\\d{2}-{1}\\d{0,2}$" options:NSRegularExpressionCaseInsensitive error:&_error];
NSMutableString *_newText = [NSMutableString stringWithString:textField.text];
[_newText insertString:string atIndex:range.location];
NSArray *_matches = [_regularExpression matchesInString:_newText options:0 range:NSMakeRange(0, _newText.length)];
return _matches.count > 0;
}
编辑#1(2013年1月22日)
当然,您的班级必须是UITextField
的委托班级,否则上述方法将永远不会被回拨。
还有一些额外的步骤可以做到。
YourViewController.h 文件中的:
@interface YourViewController : UIViewController <UITextFieldDelegate> {
// ...
}
@property (nonatomic, strong) IBOutlet UITextField *myTextField; // is case of ARC and iOS5+
@end
YourViewController.m 文件中的
- (void)viewDidLoad
{
[super viewDidLoad];
// ...
[self.myTextField setDelegate:self]; // you can do the same thing in the interface builder as well.
}
答案 2 :(得分:0)
您需要验证dummyView
UIView* dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
textField.inputView = dummyView;
因为你替换了UITextField的输入视图,所以不会调用UITextField委托。