2010-06-25 5 views
5

UITextField 개체가 여러 개인보기에서 작업하고 있습니다. 내보기 컨트롤러는 UITextFieldDelegate의 역할을하며 표시되는 레코드를 저장하고 유효성을 검사하기 위해 (BOOL)textFieldShouldEndEditing:(UITextField *)textField 메서드를 구현했습니다.textFieldShouldEndEditing 여러 번 호출 됨

항목을 편집 한 후 "완료"버튼을 클릭하고 저장/유효성 검사에 실패하면 UIAlertView이 표시되고 유효성 검사에 실패한 UITextField에 계속 보관됩니다.

내 문제는 이것이다 - 사용자가 UITextField의 또 다른에/검증 저장 실패합니다 UITextField에서 클릭 할 때, 다음 (BOOL)textFieldShouldEndEditing:(UITextField *)textField 방법은 여러 번 호출을하고 UIAlertView 여러 번 나타납니다.

사용자가 키보드에서 "완료"를 클릭하면 사용자가 UITextField을 클릭 할 때 여러 번 호출되면 (BOOL)textFieldShouldEndEditing:(UITextField *)textField이 한 번 호출되는 이유는 무엇입니까? 나는 당신의 문제가 된 TextField 방법은 당신이 TextField를 편집 할 때 전화를 직접 서로에 탭 순서에서 오는 생각

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { 
    NSLog(@"textFieldShouldEndEditing called by textField with text=%@", textField.text); 

    currentItem.nameOrNumber = nameOrNumber.text; 

    // Try to save the managed object. 
    NSError *error = nil; 
    if (![[currentItem managedObjectContext] save:&error]) {   
     UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Uh Oh!",@"") 
                  message:[error localizedDescription] 
                  delegate:self 
                cancelButtonTitle:NSLocalizedString(@"OK",@"") 
                otherButtonTitles:nil]; 
     [errorAlert show]; 
     [errorAlert release]; 
     shouldEnd = NO; 
    } 

    return shouldEnd; 
} 

답변

3

:

여기 내 코드입니다. 내가 잘못 아니에요 경우

,이 필드에 대한 필드입니다

  • textFieldDidEndEditing에 대한 필드 B
  • textFieldShouldEndEditing에 대한

    • textFieldShouldBeginEditing이 같은 수 (당신은에 편집을하고 B에 탭)한다 필드 B에 대한
    • textFieldDidBeginEditing

    그럼 언제 요 u는 textFieldShouldEndEditing 방법에 있으며, 텍스트 필드 B는 이미 첫 번째 응답자가되었습니다. 따라서 UIAlertView가 나타나면 B는 포커스를 잃고 textFieldShouldEndEditing도 호출됩니다!

    textField가 편집을 시작했을 때보기를 올리려고 할 때도 이와 같은 문제가있었습니다. 내가 찾은 해결책은 현재 하나의 textField에서 다른 텍스트 필드로 전환 중인지 여부를 나타내는 부울 클래스 변수를 만드는 것입니다. TRUEtextFieldShouldBeginEditing, FALSEtextFieldDidBeginEditing으로 설정했습니다. textFieldShouldEndEditing 인 경우 TRUE으로 설정하면 사용자가 다른 textField에서 직접 탭한 것을 의미합니다. 그런 다음 테스트를 한 번만 수행하는 올바른 방법을 찾아야합니다 (아마 shouldEndEditing이 false를 반환해야합니다).

  • 0

    각 테스트 필드에 대해 2 회 전화를 걸 수 있습니다. 왜? 그냥 ... 또한 나에게 통과했다 생각과 나

    당신이

    - (BOOL)textFieldShouldEndEditing:(UITextField *)txtField{ 
    
    if(i_dont_know){ 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" 
                    message:@"Message" 
                    delegate:self 
                  cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
        [alert show]; 
        [alert release]; 
        return false; 
    } 
    
    return true;} 
    

    과 같은 몇 가지를 할 수없는 두통 UIAlertView 쇼는 텍스트 필드 의 편집을 사임하려고인가요 얻을 및 이 기능을 "textFieldShouldEndEditing :"호출 ...

    내 문제는이 문제를 해결하기 위해 "shouldEndEditing"이라는 멤버 변수를 인터페이스 delaration에 추가하는 것이 었습니다. 그리고 "textFieldShouldEndEditing :"다음과 같이 될 수 있습니다.

    - (BOOL)textFieldShouldEndEditing:(UITextField *)txtField{ 
    
    if(shouldEndEditing == false) 
    { 
        shouldEndEditing = true; 
        return false; 
    } 
    
    if(i_dont_know){ 
        shouldEndEditing = false; 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" 
                    message:@"Message" 
                    delegate:self 
                  cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
        [alert show]; 
        [alert release]; 
        return false; 
    } 
    
    return true;} 
    

    행운을 빌어 요 ...

    1

    또 다른 옵션은 UIAlertView 가짜에게 올바른 검증을하게하고, 후자의 시간 보정 부분을 연기하는 것입니다. 이런 식으로 뭔가 :

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
        double delayInSeconds = 0.; 
        self.currentTextField.text = @"Something that won't trigger validation error"; 
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
         // do what you need here 
        }); 
    } 
    
    0

    각 텍스트 뷰에 다른 태그를 추가하고 textFieldShouldEndEditing에 태그를 확인할 수 없습니다? 아니면 요점을 놓쳤는가?

    관련 문제