0

我正在尝试对 UItextField 中的正确时间进行错误检查。我不想在用户输入时弹出错误(让他们有机会先修复它),所以我想我会在 EditingDidEnd 操作期间进行检查。我设置了小时、分钟和秒。这是我为 inHours 尝试的代码:

- (IBAction)inHourEditEnd:(id)sender
{
   // Check to make sure value is between 0 & 23 Hours
   if ([[[self inHour] text] intValue] >= 0 && [[[self inHour] text] intValue] < 24) {
      [self updateDuration];
   } else {
      NSString *errorDescription = [NSString stringWithFormat:@"%@ hours is not a valid start time. Please enter an hour between 0 and 23", [[self inHour] text]];
      UIAlertView *errorMessage = [[UIAlertView alloc] initWithTitle:@"Ivalid Hour for Start Time"
                                                                   message:errorDescription
                                                                  delegate:self
                                                         cancelButtonTitle:@"OK"
                                                         otherButtonTitles:nil];
            [errorMessage show];
            [_inHour becomeFirstResponder];
        }

    }

警报工作正常,但在显示警报后不会返回到文本字段(inHour)。它只是停留在我点击以导致 EditingDidEnd 的任何文本字段上。在此处搜索,我找到了一种使用以下代码使 alertView 将用户发送回正确文本框的方法:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
   //Checks For Approval
   if (buttonIndex == 0) {
      [_inHour becomeFirstResponder];
   }
}

但这仅适用于第一个框,我需要使其与 inHour、inMinute 和 inSeconds 一起使用。

有什么建议可以让我完成这项工作吗?这些路径中的任何一条方向是否正确?

感谢您的任何帮助。

4

1 回答 1

0

如果您真的想在文本字段已经失去第一响应者状态becomeFirstResponder进行验证,您可以向视图控制器添加一个属性来跟踪需要接收的文本字段:

// in your .m file, declare a class extension for "private" members
@interface MyViewController ()
@property (weak, nonatomic) UITextField *lastValidationFailureField;
@end

// add this to inHourEditEnd:
self.lastValidationFailureField = _inHour;

// use this property in alertView:clickedButtonAtIndex:
[self.lastValidationFailureField becomeFirstResponder];
self.lastValidationFailureField = nil;

或者,您可以阻止用户离开文本字段。让您的视图控制器实现UITextFieldDelegate并将所有文本字段的delegate出口设置到您的视图控制器。然后实施textFieldShouldEndEditing:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    if (textField == [self inHour]) {
        if ([[textField text] intValue] >= 0 && [[textField text] intValue] < 24) {
            [self updateDuration];
        } else {
            NSString *errorDescription = ...
            UIAlertView *errorMessage = ...
            [errorMessage show];
            // prevent the text field from even losing first responder status
            return NO;
        }
    }
    if (textField == [some someOtherTextFieldToValidate)] {
        ...
    }
    return YES;
}

为了简洁起见,我将所有逻辑都放在一个方法中,如果您有多个文本字段要验证,我建议至少对该代码进行一些最小的重构。

您将不再需要您的操作方法inHourEditEnd:

于 2013-07-06T12:53:46.090 回答