TextFieldShouldBeginEditing + UIKeyboardWillShowNotification + OS 3.2

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

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

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

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

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

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

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

Любые идеи, в которых я могу ошибаться?

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

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

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

.h

@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

- (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");
}

Ответ 1

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

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

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

Ответ 2

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

- (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] для любого входящего элемента управления текстом.

Надеюсь, это поможет..:) приветствия!

Ответ 3

Когда клавиатура появляется, метод вызывается службой notificationCenter. Если он не работает, установите объект в nil.

[[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];