2013-12-17 17 views
16

Così ho impostato una notifica per l'evento di comparsa tastiera. Consideriamo ora un UITextView e un UITextField.Notifiche UITextField e tastiera - ordine strano

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillShow:) 
              name:UIKeyboardWillShowNotification 
              object:nil]; 

Il selettore è:

- (void)keyboardWillShow:(NSNotification *)notification { 

     keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
} 

In caso di UITextView, il metodo delegato - (void)textViewDidBeginEditing:(UITextView *)textView viene generato DOPO metodo keyboardWillShow:. Quindi keyboardSize ha le dimensioni effettive della tastiera e sono in grado di utilizzarlo all'interno del metodo delegati textview.

Tuttavia in caso di UITextField, il metodo delegato corrispondente - (void)textFieldDidBeginEditing:(UITextField *)textField viene generato PRIMA metodo keyboardWillShow:.

Perché è così? Come faccio a ottenere il CGSize della tastiera nel caso del campo di testo poiché ora restituisce solo zero perché il delegato del campo di testo viene chiamato per primo e non il selettore della tastiera.

risposta

4

Strano ... Sembra un errore alla fine di Apple.

Forse si potrebbe ritardare la comparsa della tastiera? Ecco il mio sfortunato suggerimento "aggiramento": è possibile inviare una notifica quando il campo di testo è selezionato, ma in realtà solo in realtà inizieranno a modificare una frazione di secondo in modo che il campo di testo sia noto prima che venga chiamato keyboardWillShow:. Per esempio:

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

    // Notification corresponding to "textFieldSelected:" method 
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TEXT_FIELD_SELECTED object:nil userInfo:[[NSDictionary alloc] initWithObjectsAndKeys:textField, @"textField", nil]]; 

    // "textFieldReallyShouldBeginEditing" is initially set as FALSE elsewhere in the code before the text field is manually selected 
    if (textFieldReallyShouldBeginEditing) 
     return YES; 
    else 
     return NO: 
} 

- (void)textFieldSelected:(NSNotification*)notification { 

    // Done in a separate method so there's a guaranteed delay and "textFieldReallyShouldBeginEditing" isn't set to YES before "textFieldShouldBeginEditing:" returns its boolean. 
    [self performSelector:@selector(startTextFieldReallyEditing:) withObject:(UITextField*)notification[@"textField"] afterDelay:.01]; 
} 

- (void)startTextFieldReallyEditing:(UITextField*)textField { 
    textFieldReallyShouldBeginEditing = YES; 

    // To trigger the keyboard 
    [textField becomeFirstResponder]; 
} 

Poi a seconda di come si sta creando la notifica, è possibile inserire il valore di questo campo di testo ora noto anche prima che inizia la modifica.

+1

Nel mio caso semplice dispatch_async (mainQueue,^{}) aiutato. – Andy

4

Ho avuto lo stesso problema. Prova a utilizzare:

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView    
+0

La domanda riguarda il campo di testo e tu suggerisci il metodo del delegato testuale. Non capisco, qual è il punto? – Andy

+0

La risposta potrebbe essere irrilevante a questo problema, ma ha risolto il problema nel mio caso. Grazie! –

Problemi correlati