我正在尝试在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。
任何建议我如何才能使这项工作? 这些路径中的任何一条方向是正确的吗?
感谢您的帮助。
答案 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;
}
等操作方法。