用户如何在文本字段ios中输入时间

时间:2015-04-14 07:51:41

标签: ios objective-c uitextfield nstimer nsdateformatter

我希望用户在TextField中输入时间。有一些示例可以使用DatePicker来实现,但这会占用应用程序中的大量空间。当用户点击TextField时,他应该输入hh:mm。现在有一个占位符文本,但没有强制用户以此格式输入hh:mm所以如此,我如何在hh:mm中使用TextField格式?或换句话说,在文本字段中输入时间。

4 个答案:

答案 0 :(得分:2)

使用UITextField's shouldChangeCharactersInRange:replacementString: delegate方法格式化文本字段中的hh:mm格式文本

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
  if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
  {
    // BasicAlert(@"", @"This field accepts only numeric entries.");
    return NO;
  }
  else
  {
    NSString *text = textField.text;
    NSInteger length = text.length;
    BOOL shouldReplace = YES;

    if (![string isEqualToString:@""])
    {
        switch (length)
        {
            case 2:
                textField.text = [text stringByAppendingString:@":"];
                break;

            default:
                break;
        }
        if (length > 4)
            shouldReplace = NO;
    }

    return shouldReplace;
  }
  return YES;
}

答案 1 :(得分:0)

使用文本字段的委托方法: -

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
  return YES;
 }

在此委托方法中,您可以检查用户在文本字段中输入的文本。

replacementString为您提供用户正在输入的字符,range将为您提供插入该字符的位置。

然后,您可以在文本字段中执行所需的格式设置,使其看起来像您想要的 hh:mm 格式。

此后,您需要使用NSDateFormatter将日期格式化为NSDate

请记住,您还需要执行退格检查。因为只要在文本字段中更改了字符,就会调用此委托。

祝你好运。

任何问题,请随时提出

修改

如果你确实想要度过这个麻烦。您只需将datePicker设置为textField的输入视图即可。在选择时间时,您可以简单地格式化输入到textField中的字符串。很简单。

答案 2 :(得分:0)

你可以强迫"用户在完成后检查TextField.text(我将自己命名为pastetext)内容。首先检查字符串的长度。然后检查格式如下:

NSString *testtocheck= [[NSString alloc]init];
NSString *firstpart= [[NSString alloc]init]; // 00 - 23
NSString *firstpartisZero= [[NSString alloc]init]; // 01 - 09
NSString *myseparator= [[NSString alloc]init]; // @":"
NSString *secondpart= [[NSString alloc]init]; // 00 - 59
NSString *secondpartisZero= [[NSString alloc]init]; // 01 - 09
BOOL ok =NO;
testtocheck = self.pastetext.text;
if(testtocheck.length==0 || [testtocheck isKindOfClass:[NSNull class]] || [testtocheck isEqualToString:@""]||[testtocheck  isEqualToString:NULL]||[testtocheck isEqualToString:@"(null)"]||testtocheck==nil || [testtocheck isEqualToString:@"<null>"]){
    //   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: ....
    //      [alertView show];
} else if(testtocheck.length==5) {
    firstpart = [testtocheck substringToIndex:2];
    //now do the check
    int FIRSTval = [firstpart integerValue];

    firstpartisZero = [firstpart substringToIndex:1];
    int FIRSTvaliszero = [firstpartisZero integerValue];
              if(FIRSTvaliszero==0) {

        firstpart = [testtocheck  substringWithRange:NSMakeRange(1, 1)];
        FIRSTval = [firstpart integerValue];
    } else {
         firstpart = [testtocheck substringToIndex:2];
         FIRSTval = [firstpart integerValue];
    }
    NSLog(@"FIRSTvaliszero %d",FIRSTvaliszero);

    if(FIRSTval>= 0 && FIRSTval <= 23) {
        ok =YES;
    } else {
        //   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: ....
        //      [alertView show];
        ok= NO;
    }

    if(ok) {
        myseparator = [testtocheck  substringWithRange:NSMakeRange(2, 1)];
        if([myseparator isEqualToString:@":"]) {
            ok =YES;
        } else {
            //   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: ....
            //      [alertView show];
            ok= NO;
        }
    }
    if(ok) {
        secondpart =[testtocheck substringFromIndex:3];
        int SECONDval = [secondpart integerValue];
        secondpartisZero = [secondpart substringToIndex:1];
        int SECONDvaliszero = [secondpartisZero integerValue];

        if(SECONDvaliszero==0) {
            secondpart = [testtocheck substringFromIndex:4];
            SECONDval = [secondpart integerValue];
        } else {
            secondpart = [testtocheck substringToIndex:3];
            SECONDval = [secondpart integerValue];
        }
     NSLog(@"SECONDvaliszero %d",SECONDvaliszero);


        if(SECONDval>= 0 && SECONDval <= 59) {
            ok =YES;
        } else {
            //   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: ....
            //      [alertView show];
            ok= NO;
        }

    }
    if(ok) {
        //DO WHAT YOU WANT WITH self.pastetext.text
    } else {
        //   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: ....
        //      [alertView show];

    }
}

也许对严格的数字(数字)进行一些其他检查。

答案 3 :(得分:0)

我认为没有必要使用datepicker。您可以使用valuepicker而它可以使用任何格式。它有助于你的valuepicker的委托方法。