Есть ли уведомление, которое отправляется при смене клавиатуры (например, с NumberPad на Default)
Я пытаюсь выяснить, как я могу получать уведомления при смене клавиатуры. То, что я пытаюсь сделать, это добавить кнопку DONE на клавиатуру типа 4 и 5 (NumberPad и PhonePad), все работает нормально, за исключением случаев, когда я перехожу из TextField с использованием типа KB по умолчанию, уведомление о том, что KeyboardDidAppear не является быть уволенным.
Вот что я получил:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
}
Затем я добавил свойство для текущего типа базы данных и текущего редактируемого TextField:
#pragma mark - Delegate Methods
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
self.currentKBType = textField.keyboardType;
self.curTextField = textField;
return YES;
}
Затем я принимаю решение о том, добавлять ли эту кнопку "Готово" на основе текущего типа базы данных:
- (void)keyboardDidShow:(NSNotification *)note {
if (self.currentKBType == 4 || self.currentKBType == 5) {
[self addButtonToKeyboard];
}
}
Проблема заключается в том, что уведомление срабатывает при отображении клавиатуры, но не при ее изменении (при переходе из одного TextField в другое, в котором указан другой тип базы знаний).
Какие-либо предложения? Я что-то пропустил?
1 ответ
Понял это. Взял немного логики, но работает без нареканий. Вот что я сделал: Добавлены частные свойства для:
@property (nonatomic) UIKeyboardType currentKBType;
@property(nonatomic,strong) UITextField *curTextField;
@property(nonatomic,strong) UIButton *doneButton;
@property(nonatomic) BOOL doneButtonDisplayed;
Затем добавили следующую логику в метод делегата TextField:
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
self.currentKBType = textField.keyboardType;
if (textField.keyboardType == 4 || textField.keyboardType == 5) {
if (!doneButtonDisplayed) {
[self addButtonToKeyboard];
}
} else {
if (doneButtonDisplayed) {
[self removeButtonFromKeyboard];
}
}
self.curTextField = textField;
return YES;
}
И в KeyboardDidShowNotification, для которого я подписал VC в viewDidLoad:
- (void)keyboardDidShow:(NSNotification *)note {
if (self.currentKBType == 4 || self.currentKBType == 5) {
if (!doneButtonDisplayed) {
[self addButtonToKeyboard];
}
} else {
if (doneButtonDisplayed) {
[self removeButtonFromKeyboard];
}
}
}
И два метода, на которые ссылаются эти методы:
- (void)addButtonToKeyboard {
// create custom button
doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = CGRectMake(0, 163, 106, 53);
doneButton.adjustsImageWhenHighlighted = NO;
[doneButton setImage:[UIImage imageNamed:@"DoneNormal.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneHL.png"] forState:UIControlStateHighlighted];
[doneButton addTarget:self action:@selector(resignKeyboard) forControlEvents:UIControlEventTouchUpInside];
// locate keyboard view
if ([[[UIApplication sharedApplication] windows] count] > 1) {
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++) {
keyboard = [tempWindow.subviews objectAtIndex:i];
// keyboard found, add the button
if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) {
[keyboard addSubview:doneButton];
self.doneButtonDisplayed = YES;
}
}
}
}
- (void)removeButtonFromKeyboard {
[doneButton removeFromSuperview];
self.doneButtonDisplayed = NO;
}
И, наконец, метод resignKeyboard, который вызывается при каждом нажатии кнопки Готово:
-(void)resignKeyboard {
[self.curTextField resignFirstResponder];
self.doneButtonDisplayed = NO;
}
Это добавит эту кнопку "Готово" всякий раз, когда отображается клавиатура типа NumberPad или PhonePad, и удалит ее (только после ее добавления) из клавиатуры других типов.
Проверено и прекрасно работает.