2009-11-25 5 views
1

두 개의 텍스트 필드 (사용자 이름 및 비밀번호)가있는 로그인 화면이 있습니다. 사용자가 두 텍스트 필드 중 하나를 클릭하면 키보드가 나타나고 모든 것이 정상입니다. 그러나 사용자가 첫 번째 텍스트 필드에 대해 완료 (키보드에서)를 클릭하기 전에 다른 텍스트 필드를 클릭하면 사용자 이름의 텍스트가 저장되지 않습니다. 원래 텍스트 필드 텍스트를 저장하는 유일한 방법은 해당 텍스트 필드를 다시 클릭하고 완료를 선택하는 것입니다.iPhone 텍스트 필드/키보드 - 첫 번째 텍스트 필드가 완료 될 때까지 두 번째 텍스트 필드를 사용 중지하는 방법

첫 번째 텍스트 필드의 키보드가 열려있는 동안 다른 텍스트 필드가 키보드를 표시하지 못하도록하고 싶습니다. 텍스트 필드를 편집 할 수 없게하는 방법이 있지만 이미 키보드가 열려있을 때 어떻게 알 수 있습니까?

또 다른 해결책은 사용자가 텍스트 필드 외부를 클릭 할 때마다 키보드를 사용하지 않도록 설정하는 것입니다. 어떻게하면 좋을까요?

textFieldEmail = [[UITextField alloc] initWithFrame:frame]; 

textFieldEmail.keyboardType = UIKeyboardTypeEmailAddress; 

textFieldEmail.returnKeyType = UIReturnKeyDone;  
textFieldEmail.tag = 0;  
textFieldEmail.delegate = [[UIApplication sharedApplication] delegate]; 

textFieldPassword = [[UITextField alloc] initWithFrame:frame]; 

textFieldPassword.keyboardType = UIKeyboardTypeEmailAddress; 

textFieldPassword.returnKeyType = UIReturnKeyDone;  
textFieldPassword.tag = 1;  
textFieldPassword.delegate = [[UIApplication sharedApplication] delegate]; 

- (BOOL) textFieldShouldReturn:(UITextField *)textField { 

    [textField resignFirstResponder]; 

    return YES; 

} 

감사 :

여기 내 코드입니다!

답변

1

난 당신이 단지이 같은 작업을 수행 할 수 있습니다 싶어 .. 내가 추가 할

#pragma mark - 
#pragma mark UITextFieldDelegate 

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
    if(textField == textFieldEmail){ 
     [textFieldPassword setUserInteractionEnabled:NO]; 
    } 
    else if(textField == textFieldPassword) 
     [textFieldEmail setUserInteractionEnabled:NO]; 
} 

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textFieldEmail setUserInteractionEnabled:YES]; 
    [textFieldPassword setUserInteractionEnabled:YES]; 
    [textField resignFirstResponder]; 
    return YES; 
} 

그러나 한 가지, UI를 차단하는 아이폰 애플 리케이션 개발에 아주 나쁜 생각이다. 목표를 달성하기위한 여러 가지 해결 방법이 있습니다. 블로킹 UI를 사용하지 마십시오.

희망이 도움이됩니다. 감사합니다.

0

당신은 예 BOOL 타입의 neededInfoHasBeenEntered처럼 매끄러운을 위해, 몇 가지 플래그를하고

0

당신은 두 가지 방법에 접근 할 수있는 모든 다른 텍스트 필드에 대한 귀하의 textFieldShouldBeginEditing 대리자 메서드에서 반환 할 수 있습니다 :

가 userInteraction을 해제

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 

if(textfield == textFieldEmail) 

    { 

     textFieldPassword.userInteractionEnabled = NO; 

    }else if(textfield == textFieldPassword){ 

    textFieldEmail.userInteractionEnabled = NO; 

    } 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 

    textFieldPassword.userInteractionEnabled = YES; 

    textFieldEmail.userInteractionEnabled = YES; 

} 

또는

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 

UITextField *theOtherTextField; 

if(textView == textFieldEmail) 

    { 

     theOtherTextField = textFieldPassword; 
} 
else if(textfield == textFieldPassword) 
{ 

theOtherTextField = textFieldEmail; 
} 

return ![theOtherTextField isFirstResponder]; 
//Return no if the other text field is the first responder 

} 
,691에 텍스트 필드의
0

동일한 문제가있어서 위의 코드를 시도했지만 정상적으로 작동했습니다. 이 코드는 나에게 매우 도움이된다. 내 견해에 4 개의 textField가 있으며 코드를 다음과 같이 사용했습니다.

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
    if(textField == eventTextField){ 
       [eventPlaceTextField setUserInteractionEnabled:NO]; 
     [wineryTitleLabel setUserInteractionEnabled:NO]; 
     [vintageTextField setUserInteractionEnabled:NO]; 
    } 
    else if(textField == eventPlaceTextField) 
    { 
      [wineryTitleLabel setUserInteractionEnabled:NO]; 
     [vintageTextField setUserInteractionEnabled:NO]; 
    } 
    else if(textField == wineryTitleLabel) 
    { 
      [vintageTextField setUserInteractionEnabled:NO]; 
    } 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    int vintageVal = [vintageTextField.text intValue]; 

    if(textField == eventTextField) 
    { 
     event.eventName = eventTextField.text; 
     [eventTextField setUserInteractionEnabled:YES]; 
     [eventPlaceTextField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
    } 
    else if(textField == eventPlaceTextField) 
    { 
     event.eventPlace = eventPlaceTextField.text; 
     [eventPlaceTextField setUserInteractionEnabled:YES]; 
     [wineryTitleLabel becomeFirstResponder]; 
     [textField resignFirstResponder]; 
    } 
    else if(textField == wineryTitleLabel) 
    { 
     event.eventWinery = wineryTitleLabel.text; 
     [wineryTitleLabel setUserInteractionEnabled:YES]; 
     [vintageTextField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
    } 
    else if(textField == vintageTextField) 
    { 
     if([vintageTextField.text length] == 4 || [vintageTextField.text length]==0) 
     { 
      event.eventVintage = vintageVal; 
     } 
     else 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"!!!WARNING!!!" message:@"Enter the Vintage in the format 'YYYY'" 
                  delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alert show]; 
      [alert release]; 
      return NO; 
     } 

     [vintageTextField setUserInteractionEnabled:YES]; 
     [self setViewMovedUp:NO]; 
     [textField resignFirstResponder]; 
    } 

    return YES; 
} 
관련 문제