Есть ли уведомление, которое отправляется при смене клавиатуры (например, с NumberPad на Default) - PullRequest
2 голосов
/ 28 марта 2012

Я пытаюсь выяснить, как я могу получать уведомления при смене клавиатуры.То, что я пытаюсь сделать, это добавить кнопку 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 Ответ

6 голосов
/ 28 марта 2012

Понял это. Взял немного логики, но работает без нареканий. Вот что я сделал: Добавлены частные свойства для:

@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 и удалит ее (только после ее добавления) из клавиатуры других типов.

Протестировано и прекрасно работает.

...