2013-12-17 14 views
16

Tak więc skonfigurowałem powiadomienie o zdarzeniu dotyczącym wyglądu klawiatury. Rozważmy teraz UITextView i UITextField.Powiadomienia UITextField i klawiatury - dziwna kolejność

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

Selektor jest:

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

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

W przypadku UITextView metoda pełnomocnik - (void)textViewDidBeginEditing:(UITextView *)textView wypala PO zastosowano metodę keyboardWillShow:. Tak więc keyboardSize ma rzeczywisty rozmiar klawiatury i mogę go użyć wewnątrz metody delegowania tekstu.

Jednakże w przypadku UITextField, odpowiedni sposób pełnomocnik - (void)textFieldDidBeginEditing:(UITextField *)textField wypala PRZED zastosowano metodę keyboardWillShow:.

Dlaczego tak się dzieje? Jak zdobyć klawiaturę CGSize w przypadku pola tekstowego, ponieważ teraz zwraca zero, ponieważ delegat pola tekstowego jest nazywany pierwszym, a nie selektorem klawiatury.

Odpowiedz

4

Dziwne ... Brzmi jak błąd na końcu Apple.

Może możesz opóźnić pojawienie się klawiatury? Oto moja niestety bardzo niechlujna sugestia "obejść" - możesz wysłać powiadomienie, gdy pole tekstowe zostanie wybrane, ale potem dopiero zacznie się edycję ułamek sekundy później, tak że pole tekstowe jest faktycznie znane przed wywołaniem keyboardWillShow:. Na przykład:

-(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]; 
} 

W zależności od tego, jak tworzysz powiadomienie, możesz wstawić wartość tego znanego pola tekstowego jeszcze przed rozpoczęciem edycji.

+1

Pomógł mi w prosty sposób dispatch_async (mainQueue,^{}). – Andy

4

Miałem ten sam problem. Spróbuj użyć:

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

Pytanie dotyczy pola tekstowego i sugerujesz metodę delegowania tekstu. Nie rozumiem, o co chodzi? – Andy

+0

Odpowiedź może być nieistotna dla tego problemu, ale rozwiązała problem w moim przypadku. Dzięki! –