2009-10-22 2 views
14

Я пытаюсь использовать настраиваемую клавиатуру в своем приложении, но я сталкиваюсь с проблемами при попытке ограничить ее одним конкретным UITextField.Как узнать, что UITextField вызвало UIKeyboardWillShowNotification?

Я основывал свой код на this Xcode project (первоначально был найден на this blog). Этот код добавляет пользовательский UIButton (представляющий «десятичную точку») в представление клавиатуры UIKeyboardTypeNumberPad. Он делает это, подписываясь на UIKeyboardWillShowNotification и изменяя клавиатуру, когда она появляется.

Этот проект Xcode отлично работает, но когда я добавляю дополнительный UITextField, пользовательский ключ также вводится в клавиатуру для этого текстового поля, хотя я выбрал для этого текстового поля совершенно другой тип клавиатуры.

Я попытался зарегистрироваться, чтобы увидеть только UIKeyboardWillShowNotification уведомления от одного конкретного UITextField, но это не похоже на работу:

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

Я также попытался осмотреть объект внутри NSNotification передается keyboardWillShow, но к сожалению, это относится к клавиатуре, а не к интерфейсу пользовательского интерфейса, из-за которого клавиатура появляется.

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

}}

ли я недопонимание интерфейс addObserver? Наверняка должен быть способ подписаться на уведомления из определенного элемента управления пользовательского интерфейса?

Есть ли у кого-нибудь другие предложения о том, как этого достичь?

ответ

0

Этот проект отлично работает, но когда я добавляю дополнительный UITextField, пользовательский ключ также вводится в клавиатуру для этого текстового поля.

Вы можете установить тип клавиатуры для UITextField экземпляра и т.д .:

[myTextField setKeyboardType:UIKeyboardTypeDefault]; 

или:

myTextField.keyboardType = UIKeyboardTypeDefault; 

Поиск Xcode помощь по UITextInputTraits Protocol для списка UIKeyboardType констант.

+0

Я специально установить другой UITextField использовать разные типы клавиатуры. К сожалению, код «пользовательской клавиатуры» изменяет любую клавиатуру, которая появляется, и я не могу понять, как отличить, какой UITextField вызвал уведомление UIKeyboardWillShowNotification. Я обновил сообщение, чтобы уточнить, что немного больше. –

-2

я достиг этого раньше, сравнивая объект с объектом пользовательского интерфейса, что я заинтересован в этом, как:.

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

Это неправильно. В документации четко указано, что объект уведомления равен нулю: «UIKeyboardWillShowNotification: отображается непосредственно перед отображением клавиатуры. Объект уведомления равен нулю». – 2011-09-18 08:34:37

21

Не удалось получить какой-либо из вышеперечисленного, чтобы работать. Придется сделать это вручную:

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

Вы можете написать метод категории UIView, чтобы найти первого ответчика.

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

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

    return nil; 
} 

Тогда в вашем методе - (void)keyboardWillShow:(NSNotification *)notification вы можете использовать его как этот

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

Это сработало для меня. – Stunner

Смежные вопросы