textFieldShouldBeginEditing + UIKeyboardWillShowNotification + OS 3.2 - PullRequest
10 голосов
/ 05 июня 2010

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

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

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

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

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

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

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

Есть идеи, где я могу поступать неправильно?

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

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

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

.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

.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 ]

3 голосов
/ 30 декабря 2011

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

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

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

1 голос
/ 20 декабря 2011

Когда появляется клавиатура, метод вызывается уведомлением Центра. Если это не работает, установите объект равным 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];
1 голос
/ 02 декабря 2011

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

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

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

...