Ответ 1
Не удалось заставить любой из вышеперечисленных работать. Пришлось сделать это вручную:
if ([companyName isFirstResponder]) {
// ...............
}
else if ([notes isFirstResponder]) {
//.............
}
}
Я пытаюсь использовать настраиваемую клавиатуру в своем приложении, но я сталкиваюсь с проблемами при попытке ограничить ее одним конкретным UITextField.
Я основал свой код на этом проекте Xcode (первоначально найденном на this блог). Этот код добавляет пользовательский UIButton (представляющий "десятичную точку" ) в представление клавиатуры UIKeyboardTypeNumberPad. Он делает это, подписываясь на UIKeyboardWillShowNotification и изменяя клавиатуру, когда она появляется.
Этот проект Xcode отлично работает, но когда я добавляю дополнительный UITextField, пользовательский ключ также помещается в клавиатуру для этого текстового поля, хотя я выбрал для этого текстового поля совершенно другой тип клавиатуры.
Я попытался зарегистрировать только уведомления UIKeyboardWillShowNotification из одного конкретного UITextField, но это не работает:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:exampleViewController.textField];
Я также попытался проверить объект внутри NSNotification, переданный на клавиатуруWillShow, но, к сожалению, это относится к клавиатуре, а не к пользовательскому интерфейсу, который вызвал появление клавиатуры.
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? Наверняка должен быть способ подписаться на уведомления из определенного элемента управления пользовательского интерфейса?
Есть ли у кого-нибудь другие предложения о том, как это сделать?
Не удалось заставить любой из вышеперечисленных работать. Пришлось сделать это вручную:
if ([companyName isFirstResponder]) {
// ...............
}
else if ([notes isFirstResponder]) {
//.............
}
}
Вы можете написать метод категории 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];
Этот проект отлично работает, но когда я добавляю дополнительный UITextField, пользовательский ключ также помещается в клавиатуру для этого текстового поля.
Вы можете установить тип клавиатуры для экземпляра UITextField
, например:
[myTextField setKeyboardType:UIKeyboardTypeDefault];
или
myTextField.keyboardType = UIKeyboardTypeDefault;
Найдите в справке Xcode UITextInputTraits Protocol
список констант UIKeyboardType
.
Я достиг этого раньше, сравнивая объект с объектом UI, который меня интересует. Например:
if(notification.object == exampleViewController.textField)
{
...
}