2013-07-05 72 views
0

我正在嘗試在UItextField中進行錯誤檢查以查找正確時間。我不想在用戶輸入時彈出一個錯誤(讓他們有機會首先修復它),所以我想我會在EditingDidEnd Action期間執行Check。我爲小時,分鐘和秒設置了一些。這裏是我試過inHours代碼:無法在EditingDidEnd中設置BecomeFirstResponder動作

- (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的任何textField上。搜索在這裏我找到了一種方法,使alertView使用此代碼發送用戶返回到正確的文本框:

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

但是,這將只對第一個框工作,我需要使它與inHour,inMinute工作,很快。

任何建議如何使這項工作? 這些路徑中的哪一個朝着正確的方向?

謝謝你的幫助。

回答

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:

+0

textFieldShouldEndEditing正是我所期待的。以爲editingDidEnd是我唯一的選擇。謝謝,完美的作品。 – Brad