2009-10-22 11 views
14

Próbuję użyć niestandardowej klawiatury w mojej aplikacji, ale napotykam problemy, gdy próbuję ograniczyć ją do jednego konkretnego UITextField.Jak dowiedzieć się, co UITextField spowodowało UIKeyboardWillShowNotification?

Oparłem swój kod na this Xcode project (pierwotnie znaleziony na this blog). Ten kod dodaje niestandardowy UIButton (oznaczający "kropkę dziesiętną") do widoku klawiatury UIKeyboardTypeNumberPad. Robi to, subskrybując UIKeyboardWillShowNotification i modyfikując klawiaturę, gdy się pojawi.

Ten projekt Xcode działa świetnie, ale kiedy dodaję dodatkowy UITextField, klucz niestandardowy zostanie umieszczony na klawiaturze również dla tego pola tekstowego, mimo że wybrałem zupełnie inny typ klawiatury dla tego pola tekstowego.

Próbowałem się zarejestrować, aby tylko zobaczyć informację UIKeyboardWillShowNotification od jednej konkretnej UITextField, ale to nie wydają się działać:

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

Próbowałem też skontrolować obiekt wewnątrz NSNotification przekazane keyboardWillShow, ale niestety odnosi się to do klawiatury, a nie kontrolki interfejsu użytkownika, która spowodowała pojawienie się klawiatury.

2009-10-21 19:50:22.205 Example[6302:207] NSConcreteNotification 0x321ebd0 {name = UIKeyboardWillShowNotification; userInfo = { 
UIKeyboardAnimationCurveUserInfoKey = 0; 
UIKeyboardAnimationDurationUserInfoKey = 0.300000011920929; 
UIKeyboardBoundsUserInfoKey = NSRect: {{0, 0}, {320, 216}}; 
UIKeyboardCenterBeginUserInfoKey = NSPoint: {160, 588}; 
UIKeyboardCenterEndUserInfoKey = NSPoint: {160, 372}; 

}}

jestem nieporozumienie interfejs addObserver? Z pewnością musi istnieć sposób na subskrypcję powiadomień z konkretnego kontrolera interfejsu użytkownika?

Czy ktoś ma jakieś inne sugestie, jak to osiągnąć?

Odpowiedz

0

Ten projekt działa świetnie, ale kiedy dodaję dodatkowy UITextField, klucz niestandardowy zostanie umieszczony na klawiaturze również dla tego pola tekstowego.

Można ustawić typ klawiatury dla instancji UITextField, np .:

[myTextField setKeyboardType:UIKeyboardTypeDefault]; 

czyli

myTextField.keyboardType = UIKeyboardTypeDefault; 

Szukaj pomocy Xcode na UITextInputTraits Protocol do listy UIKeyboardType stałych.

+0

I specjalnie ustawić inną UITextField używać różnych rodzajów klawiatury. Niestety, kod klawiatury użytkownika modyfikuje klawiaturę, która się pojawia, i nie wiem, jak odróżnić UITextField od zgłoszenia powiadomienia UIKeyboardWillShowNotification. Zaktualizowałem post, aby wyjaśnić, że trochę więcej. –

-2

udało mi się osiągnąć to przed porównując obiekt z obiektu UI, że jestem zainteresowany jak to:.

if(notification.object == exampleViewController.textField) 
{ 
    ... 
} 
+7

To jest złe. Dokumentacja wyraźnie stwierdza, że ​​obiekt powiadomienia jest zerowy: "UIKeyboardWillShowNotification: Wysłanie tuż przed wyświetleniem klawiatury. Obiekt powiadomienia jest zerowy." –

21

nie udało się uzyskać żadnej z powyższych do pracy. Musiał to zrobić ręcznie:

if ([companyName isFirstResponder]) { 
    // ............... 
} 
else if ([notes isFirstResponder]) { 
    //............. 
    } 
} 
2

Możesz napisać metodę kategorii UIView, aby znaleźć pierwszą odpowiedź.

- (UIView *)firstResponder 
{ 
    if ([self isFirstResponder]) 
    { 
     return self; 
    } 

    for (UIView *view in self.subviews) 
    { 
     UIView *firstResponder= [view firstResponder]; 
     if (firstResponder) 
     { 
      return firstResponder; 
     } 
    } 

    return nil; 
} 

Następnie w metodzie - (void)keyboardWillShow:(NSNotification *)notification można go używać jak to

UITextField *textField = (UITextField *)[self firstResponder]; 
+0

To zadziałało dla mnie. – Stunner

Powiązane problemy