2015-08-19 7 views
5

Sto sperimentando un problema con il tastierino numerico quando si scatta l'UIViewController corrente da UINavigationController.Tastiera visualizzata brevemente quando si apre il controller di vista iOS

Nel mio attuale UIViewController. Ho alcuni UITextField e un pulsante "Salva" in UINavigationBar. Il comportamento previsto è il seguente:

Quando l'utente tocca "Salva", la tastiera deve nascondersi e viene eseguita un'operazione di rete. Nel suo callback, viene mostrato un UIAlertView. Quando l'utente respinge questa UIAlertView, una notifica solleva e l'UIViewController attuale effettua

[self.navigationController popViewControllerAnimated:YES]; 

Il fatto è che se "Salva" viene premuto con la tastiera che mostra ancora, dopo aver eseguito la popViewControllerAnimated, la tastiera appare brevemente e da sinistra a a destra (come se fosse visibile nel precedente UIViewController).

Ho provato

[myTextField resignFirstResponder] 

quando utente tocca "Salva", quando l'utente chiude l'UIAlertView, e anche nel metodo

viewWillDisappear 

. Altre risposte suggeriscono l'utilizzo di

[self.view endEditing:YES]; 

ma non funziona neanche.

Se potessi usare la tastiera normale sarebbe banale per ignorare

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 

    return YES; 
} 

di nasconderlo quando l'utente tocca "Return", "Fine", ecc Ma essendo il tastierino numerico non ti permettere per mostrare che il pulsante "Finisci".

Apprezzerei tutto l'aiuto, Grazie a tutti per il vostro tempo

+0

è necessario aggiungere il pulsante Fatto/Annulla al tastierino numerico. –

+0

Utilizzare [self.view endEditing: YES]; prima di [auto.navigationController popViewControllerAnimated: YES]; – Dev

+0

@ T_77 Ho provato [myTextField setReturnKeyType: UIReturnKeyDone]; e non funziona – LuisSedano

risposta

1

Prova questo:

Impostare il delegato campo di testo e il suo tipo di ritorno come fatto e pad come tastierino numerico.

_textField.delegate = self; 
_textField.keyboardType = UIKeyboardTypeDecimalPad; 
[_textField setReturnKeyType:UIReturnKeyDone]; 

e ora aggiungere i pulsanti alla tastiera:

-(void)addButtonsToKeyboard 
{ 
    UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init]; 
    [keyboardDoneButtonView sizeToFit]; 


    UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil) 
                    style:UIBarButtonItemStyleDone target:self 
                    action:@selector(kbDoneAction:)]; 

    UIBarButtonItem* seperatorItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 


    UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) 
                    style:UIBarButtonItemStylePlain target:self 
                    action:@selector(kbCancelAction:)]; 


    [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:cancelButton,seperatorItem, doneButton, nil]]; 
    _textField.inputAccessoryView = keyboardDoneButtonView; 
} 

e per nascondere la tastiera:

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

e il metodo di azione fatto è:

-(void)kbDoneAction:(id)sender 
{ 
    [_textField resignFirstResponder]; 
} 

e Annulla metodo di azione è:

-(void)kbCancelAction:(id)sender 
{ 
[_textField resignFirstResponder]; 
    } 
+0

Non dimenticare di chiamare il metodo addButtons su viewDidload –

+0

Ancora non funziona. Come soluzione, ho disabilitato il pulsante di salvataggio fino a quando non si chiama kDoneAction, ma manca il punto di nasconderlo quando si preme "Salva" – LuisSedano

0

Ho avuto una situazione simile. Ho finito per ritardare lo popViewControllerAnimated un po 'più lungo della durata dell'animazione della tastiera (0.333 secondi).

0
Try using the below code. It works fine for iOS 8 and below version 

    if (IS_OS_8_OR_LATER) { 
      UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert]; 

      UIAlertAction *cancelAction = [UIAlertAction 
             actionWithTitle:B_title 
             style:UIAlertActionStyleCancel 
             handler:^(UIAlertAction *action) 
             { 
              [self.navigationController popViewControllerAnimated:YES]; 

             }]; 
     [alertVC addAction:cancelAction]; 
     [self presentViewController:alertVC animated:YES completion:nil]; 
     } 
     else{ 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
      [alert show]; 
     } 
}