用文本字段掩盖的日期和时间

时间:2013-01-18 10:40:52

标签: objective-c ipad validation uitextfield

大家好,

我正在开发一个项目,当我们点击文本字段时,不应弹出需求键盘,因为我们正在为特定文本字段创建数字键盘,并且我们已成功通过...

- (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;

}

请帮助我解决这个问题或其他任何方式。

由于

3 个答案:

答案 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委托。