Как узнать, что UITextField вызвал UIKeyboardWillShowNotification? - PullRequest
15 голосов
/ 22 октября 2009

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

Я основал свой код на этом проекте Xcode (первоначально найденном на этом блоге ). Этот код добавляет пользовательскую кнопку UIB (представляющую «десятичную точку») в представление клавиатуры 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? Конечно, должен быть способ подписаться на уведомления от определенного элемента управления пользовательского интерфейса?

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

Ответы [ 4 ]

23 голосов
/ 16 мая 2010

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

if ([companyName isFirstResponder]) {
    // ...............
}
else if ([notes isFirstResponder]) {
    //.............
    }
}
2 голосов
/ 11 мая 2015

Вы можете написать метод категории 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 голосов
/ 24 ноября 2009

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

if(notification.object == exampleViewController.textField)
{
  ...
}
0 голосов
/ 22 октября 2009

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

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

[myTextField setKeyboardType:UIKeyboardTypeDefault];

или

myTextField.keyboardType = UIKeyboardTypeDefault;

Найдите в справке Xcode по UITextInputTraits Protocol список UIKeyboardType констант.

...