textFieldShouldBeginEditing + UIKeyboardWillShowNotification + OS 3.2

У меня есть несколько текстовых полей на UIView.

Я ухожу в отставку для предыдущего textField в методе textFieldShouldBeginEditing, где выполняется следующая последовательность событий

  • UIKeyboardWillHideNotification получено в соответствии с тем полем, где клавиатура для предыдущего поля скрыта.

  • метод textFieldShouldBeginEditing возвращает YES, а затем

  • UIKeyboardWillShowNotification получено там, где отображается клавиатура для текущего поля.

Однако в OS 3.2, хотя textFieldShouldBeginEditing возвращает YES, UIKeyboardWillShowNotification для текущего поля не получено.

Логика работает для ОС < 3.2

Любые идеи, где я могу делать неправильно?

Ниже приведена часть моего кода (только с двумя текстовыми полями в xib).

Мне нужно выполнить ряд операций с клавиатуры WillShow и keyboardWillHide. Посмотрите на разницу при запуске кода в OS 3.2 и OS < 3.2

Кто-нибудь может объяснить разницу в поведении?

.час

@interface ExampleViewController : UIViewController  
{
    IBOutlet UITextField *numericTextField;
    IBOutlet UITextField *alphaTextField;   
    UITextField *lastTextField;
    int lastCursorPos;
    int cursorPosition;
    NSMutableArray *textFields;
}

@property (nonatomic, retain) UITextField *lastTextField;
@property (nonatomic, retain) NSMutableArray *textFields;

@end

.m

- (void)viewWillAppear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification object:self.view.window]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification object:self.view.window]; 

    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
    self.textFields = [[NSMutableArray alloc] initWithCapacity:2];
    [self.textFields insertObject:alphaTextField atIndex:0];
    [self.textFields insertObject:numericTextField atIndex:1];
    cursorPosition = 1;
    [numericTextField becomeFirstResponder];
}

-(void)viewWillDisappear:(BOOL)animated 
{
    [self setEditing:NO animated:YES];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{
    int index;
    for(UITextField *aField in self.textFields){

        if (textField == aField){
            index = [self.textFields indexOfObject:aField];
        }
    }
    if(index>=0 ){
        lastCursorPos = cursorPosition;
        self.lastTextField = [self.textFields objectAtIndex:lastCursorPos-1];
        cursorPosition = index +1;

    }
    [self.lastTextField resignFirstResponder];  

    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {        
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES; 
}

- (void)keyboardWillShow:(NSNotification *)notif {
    NSLog(@"Inside keyboardWillShow");
}

- (void)keyboardWillHide:(NSNotification *)notif {      
    NSLog(@"Inside keyboardWillHide");
}

3 ответа

Решение

Я считаю, что с iOS 3.2 UIKeyboardWillHideNotification и UIKeyboardWillShowNotification больше не запускаются при переключении между двумя текстовыми полями. По сути, уведомления запускаются только в том случае, если клавиатура действительно показана или скрыта, а поскольку переключение с одного текстового поля на другое не скрывает клавиатуру, событие не запускается.

До iOS 3.2 события использовались, когда вы меняли поля. Новый способ, возможно, более правильный, но он делает то, что вы пытаетесь сделать, немного более сложным.

Возможно, вам лучше реализовать делегат для текстовых полей, тогда вы можете проверить наличие событий shouldBeginEditing / didEndEditing, или, альтернативно, вы можете создать подкласс UITextField и переопределить методы становления FirstResponder/resignFirstResponder, чтобы вы могли подключиться к ним и реализовать свою логику, когда поля получают и теряют фокус.

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

- (void)textFieldDidBeginEditing:(UITextField *)textField;
- (BOOL)textFieldShouldReturn:(UITextField *)textField;

Первый метод вызывается всякий раз, когда вы касаетесь текстового поля для редактирования. Здесь вы можете написать свой код изменения клавиатуры

EG: If textfield is of type 1
       set Keyboard Type to alphanumeric.
    Else if textfield is of type 2
       set Keyboard Type to numeric only.

Затем второй метод вызывается всякий раз, когда вы нажимаете клавишу RETURN на экранной клавиатуре. Здесь вы можете написать оператор [textfield resignFirstResponder] для любого входящего элемента управления текстовым полем.

Надеюсь, что это помогает..:) ура!

Когда появляется клавиатура, метод вызывается по уведомлению Центра. Если это не работает, установите объект на ноль.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) 
name:UIKeyboardWillShowNotification object:self.view.window]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) 
name:UIKeyboardWillHideNotification object:self.view.window];
Другие вопросы по тегам