无法在EditingDidEnd Action中设置BecomeFirstResponder

时间:2013-07-05 17:36:39

标签: cocoa-touch

我正在尝试在UItextField中进行错误检查以确定正确的时间。我不希望在用户输入时弹出错误(为了让他们有机会先修复它)所以我想我会在EditingDidEnd Action期间进行检查。我设置了小时,分钟和秒。这是我在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)。 它只停留在我点击的任何textField上以导致EditingDidEnd。在这里搜索我发现了一种方法,使用以下代码使alertView将用户发送回正确的文本框:

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

但这只适用于第一个框,我需要使用inHour,inMinute和inSeconds。

任何建议我如何才能使这项工作? 这些路径中的任何一条方向是正确的吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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; } 等操作方法。