2010-06-04 2 views
0

Я использую поле тегов в качестве флага для текстовых полей просмотра текстовых полей для автоматического перехода к следующей области:Как сбросить клавиатуру для поля ввода?

- (BOOL)findNextEntryFieldAsResponder:(UIControl *)field { 
    BOOL retVal = NO; 
    for (UIView* aView in mEntryFields) { 
    if (aView.tag == (field.tag + 1)) { 
     [aView becomeFirstResponder]; 
     retVal = YES; 
     break; 
    } 
} 
return retVal; 
} 

Он отлично работает в условиях автоматического перехода к следующей области при следующей клавиши, , Однако, мой случай состоит в том, что клавиатура отличается от некоторых полей. Например, одно поле является числовым & пунктуацией, а следующий по умолчанию (буквенные). Для числовой клавиатуры & в порядке, но следующее поле останется таким же. Он требует, чтобы пользователь нажал 123, чтобы вернуться на клавиатуру ABC.

Я не уверен, есть ли способ сбросить клавиатуру для поля, поскольку его клавиатура определена в xib? Не уверены, есть ли какие-либо API-интерфейсы? Думаю, мне нужно сделать что-то, это следующий делегат?

-(void)textFieldDidBegingEditing:(UITextField*) textField { 
    // reset to the keyboard to request specific keyboard view? 
    .... 
} 

OK. Я нашел a solution close to my case by slatvik:

-(void) textFieldDidBeginEditing:(UITextField*) textField { 
    textField.keyboardType = UIKeybardTypeAlphabet; 
} 

Однако в случае предыдущего текстовым полей является числовым, клавиатура остается числовой при автоматическом прыгнули к следующему полю. Есть ли способ установить клавиатуру в режим алфавита?

ответ

0

Наконец-то я выясню, как решить мою проблему. В моем случае мне нравится использовать клавишу «Ввод» или «Далее» для автоматического перехода в следующее доступное поле. Если два поля в последовательности имеют совершенно разные клавиатуры, смена клавиатуры должна быть прекрасной. Однако, если одна из них - клавиатура с цифровым режимом, а следующая - в режиме алфавита, то автоматический переход не приведет к изменению режима работы одной и той же клавиатуры.

Основная причина заключается в том, что мой вызов findNextEntryFieldAsResponder: метод выполняется в методе textFieldShouldReturn: delegate. Вызов вызвал следующее поле становится Ответчиком:

... 
[aView becomeFirstResponder]; // cause the next fields textFieldDidBeginEditing: event 
... 

Я нашел это в моем NSLog отладки сообщении:

textFieldShouldReturn: start 
    findNextEntryFieldAsResponder 
    textFieldDidBeginEditing: start 
    ... 
    textFieldDidBeginEditing: end 
    ... 
textFieldShouldReturn: end 

Что мне нужно сделать, это к следующему полю, как ответчик из textFieldShouldReturn: событие вызов. Я попытался использовать локальную инфраструктуру уведомлений iphone для запуска события async-уведомления в textFieldShouldReturn: и он делает то, что я ожидаю.

Вот мои обновленные коды:

- (BOOL)findNextEntryFieldAsResponder:(UIControl *)field { 
    BOOL retVal = NO; 
    for (UIView* aView in mEntryFields) { 
    if (aView.tag == (field.tag + 1)) { 
     if ([self.specialInputs containsObject:[NSNumber numberWithInt:aView.tag]]) { 
     NSNotification* notification = [NSNotification notificationWithName: 
      @"myNotification" object:aView]; 
     [[NSNotificationQueue defaultQueue] 
      enqueueNotification:notification postingStyle:NSPostWhenIdle 
      coaslesceMask:NSNotificationCoalescingOnName forModes:nil]; 
     [[NSNotifiationCenter defaultCenter] addObserver:self 
      selector:@selector(keyboardShowNofication:) 
      name:@"myNotification" object:nil]; 
     } 
     else { 
     [aView becomeFirstResponder]; 
     } 
     retVal = YES; 
     break; 
    } 
    } 
    return retVal; 
} 
... 
// Notification event arrives! 
-(void) keyboardShowNofication:(NSNotification*) notification { 
    UIResponder* responder = [notification object]; 
    if (responder) { 
    [responder becomeFirstResponder]; // now the next field is responder 
    } 
} 
... 
-(void) dealloc { 
    ... 
    // remember to remove all the notifications from the center! 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    ... 
} 

где specialInputs является NSArray ИНТ значений. Это свойство может быть установлено с помощью тегов списка как специальные входы. На самом деле, я думаю, что все входные данные можно трактовать как specialInputs, и это работает (просто больше уведомлений).

У меня есть a complete description of codes in my blog.

Смежные вопросы