2015-05-28 14 views
9

Ho aggiornato Xcode 6.3 e ios8.3 controllo il mio codice. poi mi dà un risultato strano.La tastiera apparirà automaticamente in ios 8.3 durante la visualizzazione di alertview o alertcontroller

Ecco la prima schermata della mia app demo. ecco un campo di testo. quando digito qualcosa nella tastiera textfield aperta.

enter image description here

dopo aver digitato completato. Ho fatto clic sul pulsante Mostra avviso. Ho visualizzato l'avviso e l'output seguirà.

enter image description here

Dopo aver fatto clic sul annullare. Ho visualizzato un altro avviso, quindi la tastiera dei risultati non dovrebbe essere aperta, ma quando si fa clic sul pulsante Annulla. mostra un altro avviso e la tastiera apparirà automaticamente.

qui è schermata successiva uscita

enter image description here

segue è il codice

- (IBAction)MethodShowAlert:(id)sender 
{ 

[tmptxtField resignFirstResponder]; 
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Check Alert textField" message:@"keyboard should not be open" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil]; 
[alert show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    { 
    [self showCustomAlertWithTitle:nil]; 
    } 


-(void)showCustomAlertWithTitle:(NSString *)title{ 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Now Check" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil]; 

     [alertView show] 
    } 

risposta

15

Sì, è strano.

Ma da iOS 8, suggerisco di utilizzare UIAlertController anziché UIAlertView.

Sostituire il codice con questo:

- (IBAction)MethodShowAlert:(id)sender 
{ 

    [tmptxtField resignFirstResponder]; 

    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"Check Alert textField" 
                       message:@"keyboard should not be open" 
                     preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"Cancel" 
                  style:UIAlertActionStyleDefault 
                  handler:^(UIAlertAction *action) { 
                   [self showCustomAlertWithTitle:@"Now Check"]; 
                  }]; 

    [alertController addAction:cancelAction]; 

    [self presentViewController:alertController animated:YES completion:nil]; 
} 


-(void)showCustomAlertWithTitle:(NSString *)title{ 

    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:title 
                       message:nil 
                     preferredStyle:UIAlertControllerStyleAlert]; 

    [self presentViewController:alertController animated:YES completion:nil]; 
} 

La tastiera non mostrerà dopo il click sul pulsante.

+0

non funziona per me, iOS 10 :( – ArtStyle

7

Questo è stato un cambiamento nel comportamento introdotto in iOS 8.3. Prova a scaricare il simulatore iOS 8.2 e vedrai il vecchio comportamento.

Il risultato della mia analisi è stata la seguente:

  1. Quando viene visualizzato un avviso, salva la tastiera attualmente mostrando.
  2. Quando un avviso ha completato l'animazione di rimozione, ripristina la tastiera salvata in precedenza.

Quindi in -[id<UIAlertViewDelegate> alertView:clickedButtonAtIndex:], sei tra questi stati. Quindi, cosa succede con due avvisi che vengono visualizzati allo stesso tempo:

  1. Mostra avviso1. Salva tastiera visibile. Nascondi tastiera.
  2. L'utente tocca l'avviso.
  3. Mostra avviso2. Salva che non c'è la tastiera.
  4. Alert1 completa l'animazione di eliminazione. Ripristina tastiera salvata. La tastiera è visibile.
  5. L'utente tocca l'avviso.
  6. Alert2 è stato chiuso. Ripristina che non c'è la tastiera. Nascondi tastiera.

Il mio consiglio è di utilizzare un metodo UIAlertViewDelegate chiamato dopo che l'animazione di eliminazione è stata completata e mostrare il prossimo avviso.

+0

ho usato la soluzione funziona. Ho intenzione di aggiornare il mio app su AppStore è ha approvato o no? Perché UIAlertView è deprecato. –

+0

È ancora possibile utilizzare UIAlertView nelle app inviate all'App Store.Il problema con API deprecate: s è che potrebbero smettere di funzionare nelle versioni future di iOS, ma è comunque necessario utilizzare UIAlertView nelle app destinate a iOS 7. – Mats

+0

Ho avuto lo stesso problema menzionato Nella mia domanda ho notato che se la mia tastiera è visibile e faccio clic sul pulsante "UIKeyboardWillShowNotification" è stato inviato dopo aver fatto clic sul pulsante OK di alertView. Ho provato a fare "self.resignFirstResponder", ma continuava a lanciare lo stesso notifica dopo l'avviso La vista è stata respinta. 'activeTextField.endEditing (true)' ha risolto il mio problema! –

19

Nel mio caso ho provato a nascondere la tastiera, prima di mostrare avviso, quindi non salverà la tastiera in memoria per presentarla di nuovo dopo averla chiusa autonomamente.

per cui è sufficiente chiudere la tastiera che richiederà il tempo di animazione predefinito per nascondere, solo allora è necessario presentare la vista di avviso, quindi non salverà quella tastiera.

è necessario mettere intorno 0,6 secondi divario nel nascondere la tastiera e la presentazione di avviso

[YOUR_TEXT resignFirstResponder]; 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 


        _alertVw = [[UIAlertView alloc] initWithTitle:@"" message:@"message." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 

        [_alertVw show]; 
}); 
+0

consente di risparmiare un sacco di tempo ... thanx .... e più 1 –

+0

Troppo buono. Grazie. –

+0

cercava quel bug per ore! grazie mille amico;) – polo987

0

Sostituisci il tuo metodo di avviso dal basso metodo.

UIAlertController * alertVC = [UIAlertController alertControllerWithTitle: messege title message: message preferredStyle: UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction 
           actionWithTitle:@"OK" 
           style:UIAlertActionStyleCancel 
           handler:^(UIAlertAction *action) 
           { 

           }]; 
[alertVC addAction:cancelAction]; 

[[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{ 

}]; 
Problemi correlati