2011-10-29 10 views
5

Po prostu spędziłem większość dnia na wyśledzeniu bardzo dziwnego przypadku, w którym wywołanie metody resignFirstResponder na aktywnym UITextField nie ukryło klawiatury, mimo że pole tekstowe było pierwszą odpowiedzią . Dzieje się tak, gdy przesuję kontroler widoku na inny kontroler widoku z aktywnym polem tekstowym. Klawiatura zniknie (zgodnie z oczekiwaniami). Ale jeśli przywrócę klawiaturę, dotykając pola tekstowego w kontrolerze drugiego widoku, kolejne wywołania metody resignFirstResponder nie przynoszą żadnego efektu.Nie można ukryć klawiatury w stosie UIViewController, gdy UIAlertView jest na ekranie

Oto prosty kod do odtworzenia problemu. Ten kod to kontroler widoku z przyciskiem paska nawigacji, który ukrywa klawiaturę, a drugi do wypychania kolejnej kopii (z potwierdzeniem UIAlertView). Pierwsza kopia działa bez problemu. Jeśli jednak wciśniesz drugą kopię (gdy pierwsza kopia ma widoczną klawiaturę), nie można zamknąć klawiatury. Dzieje się tak tylko wtedy, gdy na ekranie pojawi się UIAlertView (potwierdzenie), gdy druga kopia zostanie naciśnięta. Jeśli usuniesz linię #define ALERT, wszystko działa.

Czy ktoś wie, co się tutaj dzieje? Wygląda na to, że okno UIALertView w jakiś sposób ingeruje w klawiaturę i sprawia, że ​​jej okno nie znika, co powoduje mylenie następnego widoku. Czy istnieje tutaj inne rozwiązanie niż przesuwanie kontrolera 2-go widoku na zegar po zniknięciu UIALertView?

Przepraszamy za złożony opis. To jest działający kod. Mam nadzieję, że kod jest jasny.

@implementation DemoViewController 

- (id) init { 
    if (!(self = [super init])) 
     return nil; 

    return self; 
} 

- (void) dealloc { 
    [_inputTextfield release]; 
    [super dealloc]; 
} 

- (void) loadView { 
    UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

    _inputTextfield = [[UITextField alloc] initWithFrame:CGRectMake(0., 0., 320., 44.)]; 
    _inputTextfield.borderStyle = UITextBorderStyleRoundedRect; 
    _inputTextfield.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
    _inputTextfield.keyboardAppearance = UIKeyboardAppearanceAlert; 
    _inputTextfield.autocapitalizationType = UITextAutocapitalizationTypeNone; 
    _inputTextfield.autocorrectionType = UITextAutocorrectionTypeNo; 
    _inputTextfield.keyboardType = UIKeyboardTypeDefault; 
    [view addSubview:_inputTextfield]; 

    self.view = view; 
    [view release]; 
} 

- (void) viewWillAppear:(BOOL) animated { 
    [super viewWillAppear:animated]; 

    UIButton *downButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [downButton setTitle: @"keyboard down" forState:UIControlStateNormal]; 
    [downButton addTarget:self action:@selector(downButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    [downButton sizeToFit];  
    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:downButton] autorelease]; 

    UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [nextButton setTitle: @"next" forState:UIControlStateNormal]; 
    [nextButton addTarget:self action:@selector(nextButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    [nextButton sizeToFit]; 
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:nextButton] autorelease];; 

} 

- (void) viewWillDisappear:(BOOL) animated { 
[super viewWillDisappear:animated]; 
    [_inputTextfield resignFirstResponder]; 
} 

- (void) downButtonPressed:(id)sender { 
    [_inputTextfield resignFirstResponder]; 
} 

#define ALERT 

- (void) alertView:(UIAlertView *) alertView didDismissWithButtonIndex:(NSInteger) buttonIndex { 
    if (alertView.cancelButtonIndex == buttonIndex) { 
     return; 
    } 
    [self _nextButtonPressed]; 
} 

- (void) _nextButtonPressed { 
    DemoViewController *nextViewController = [[DemoViewController alloc] init];  
    [self.navigationController pushViewController:nextViewController]; 
    [nextViewController release]; 
} 

- (void) nextButtonPressed:(id)sender { 
#ifdef ALERT 
    UIAlertView *alert = [[UIAlertView alloc] init]; 
    alert.message = @"Next view?"; 
    alert.cancelButtonIndex = [alert addButtonWithTitle:@"No"]; 
    [alert addButtonWithTitle:@"Yes"]; 
    alert.delegate = self; 
    [alert show]; 
    [alert release]; 
#else 
    [self _nextButtonPressed];  
#endif 
} 
+0

Czy próbowałeś rezygnacji pierwszy responder na pierwszym kontrolerze widoku przed przedstawieniem drugiego kontrolera widoku? –

+0

Tak, w widokuOdkryj się. Przepraszam, to nie wchodziło w mój kod demo. Ale nie ma to żadnego wpływu. – wombat57

+0

OK, Czy próbowałeś użyć [self.view do zakończenia edycji: TAK]? to powinno również zakończyć edycję we wszystkich subviewsach. –

Odpowiedz

4

Jeśli miał pecha rezygnacji swoje pierwsze odpowiedzią, oto kilka rozwiązań, które mogą pomóc:

  1. Ustal, który pozostał pierwszy responder po ostatnim zaproszeniu do dymisji pierwszą odpowiedź.

  2. Spróbuj rezygnacji wszystkie pierwsze odpowiadających pojedynczym wywołaniu self.view (zobacz kontenera)

    [self.view endEditing:YES]; 
    
  3. TYLKO jeśli Próbowałem wszystkie powyższe metody i żaden pracował, należy rozważyć zastosowanie tego obejścia .

    -(BOOL)textViewShouldEndEditing:(UITextView *)textView { 
        NSArray *wins = [[UIApplication sharedApplication] windows]; 
        if ([wins count] > 1) { 
        UIWindow *keyboardWindow = [wins objectAtIndex:1]; 
        keyboardWindow.hidden = YES; 
        } 
        return YES; 
    } 
    
Powiązane problemy