0

大家好,

我正在做一个项目,当我们单击文本字段时,要求键盘不应弹出,因为我们正在为特定文本字段制作数字键盘,并且我们已经成功地做到了这一点。

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

}

请帮助我摆脱这个问题或任何其他方式来做到这一点。

谢谢

4

3 回答 3

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(22/01/13)

当然,你的类必须是你的委托类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.
}
于 2013-01-18T14:48:32.033 回答
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;
}
}

它对我来说很好。

于 2013-01-18T13:57:16.400 回答
0

您需要验证您的输入dummyView

UIView* dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
textField.inputView = dummyView;

由于您替换了 UITextField 的输入视图,因此不会调用 UITextField 委托。

于 2013-04-11T12:16:01.593 回答