代码之家  ›  专栏  ›  技术社区  ›  David.Chu.ca

如何重置输入字段的键盘?

  •  0
  • David.Chu.ca  · 技术社区  · 16 年前

    我使用标记字段作为文本字段的标志文本视图字段用于自动跳转到下一个字段:

    - (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?
      ....
    }
    

    好啊。我发现 a solution close to my case by slatvik :

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

    但是,如果前面的文本字段是数字,则当自动跳到下一个字段时,键盘将保持数字。有没有办法将键盘设置为字母模式?

    1 回复  |  直到 16 年前
        1
  •  0
  •   David.Chu.ca    16 年前

    最后我找到了解决问题的方法。在我的例子中,我喜欢使用entry或next键自动跳转到下一个可用字段。如果按顺序排列的两个字段的键盘完全不同,则键盘更改应该可以。但是,如果一个是数字模式的键盘,下一个是字母模式,那么自动跳转不会导致同一个键盘改变模式。

    主要原因是我对findExtentryFieldsResponder:方法的调用是在textfieldShouldReturn:委托方法中完成的。导致下一个字段成为响应者的调用:

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

    我在nslog调试消息中找到了这个:

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

    我需要做的是将下一个字段作为textfieldShouldReturn:event调用的响应程序。我尝试使用iPhone的本地通知框架来在textfieldShouldReurn:中触发异步通知事件,它实现了我所期望的。

    这是我更新的代码:

    - (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是一个int值数组。它是一个属性,可以用一个列表标记作为特殊输入进行设置。实际上,我认为所有的输入都可以作为特殊的输入来处理,它也可以工作(只是更多的通知)。

    我有 a complete description of codes in my blog .