Interface Builder选项卡订单键入

时间:2010-09-20 16:27:14

标签: iphone ipad interface interface-builder uitextfield

我注意到,在我在iPad应用程序中的一个视图中,我正在构建键盘上的下一个按钮,从屏幕左下方经过所有UITextField。

是否有可能以某种方式让它从上到下,从右到上,从上到下?

所以说我需要两个长列的文本字段,我要从上到下从左到右,有意义吗?

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:1)

我认为IB没有办法,但你可以在代码中这样做。你实际上没有标签,你将使用返回键。

将它放在UITextField的委托中:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
  BOOL shouldChangeText = YES;

  if ([text isEqualToString:@"\n"]) {
    // Find the next entry field
    BOOL isLastField = YES;
    for (UIView *view in [self entryFields]) {
      if (view.tag == (textView.tag + 1)) {
        [view becomeFirstResponder];
        isLastField = NO;
        break;
      }
    }
    if (isLastField) {
      [textView resignFirstResponder];
    }

    shouldChangeText = NO;
  }

  return shouldChangeText;
} 

在此处找到:http://iphoneincubator.com/blog/tag/uitextfield

答案 1 :(得分:0)

您需要实现UITextFieldDelegate的- (BOOL)textFieldShouldReturn:(UITextField *)textField方法。有关如何使用此方法控制订单的示例位于this question

答案 2 :(得分:0)

我想详细说明@sprocket's answer解决同一问题。仅仅因为开箱即用的东西并不意味着你应该停止思考一种更好的方式 - 甚至是正确的方式 - 做某事。他注意到这种行为没有记录,但大部分时间都符合我们的需求。

但这对我来说还不够。想一想RTL语言,标签仍然会从左到右标签,更不用说行为与模拟器完全不同(设备不会将第一个输入集中在标签上)。最重要的是,Apple的未记录的实现似乎只考虑当前安装在视图层次结构中的视图。

想象一下表格形式(没有双关语)的表格视图。每个单元格都包含一个控件,因此并非所有表单元素都可以同时显示。一旦你到达最底层(在屏幕上!)控制,苹果只会循环回来,而不是向下滚动。这种行为绝对不是我们想要的。

所以这就是我想出的。您的表单应由视图控制器管理,视图控制器是响应程序链的一部分。因此,您完全可以自由地实施以下方法:

#pragma mark - Key Commands

- (NSArray *)keyCommands
{
    static NSArray *commands;

    static dispatch_once_t once;
    dispatch_once(&once, ^{
        UIKeyCommand *const forward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:0 action:@selector(tabForward:)];
        UIKeyCommand *const backward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierShift action:@selector(tabBackward:)];

        commands = @[forward, backward];
    });

    return commands;
}

- (void)tabForward:(UIKeyCommand *)command
{
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;

    for (UIResponder *const responder in controls) {
        if (firstResponder != nil && responder.canBecomeFirstResponder) {
            [responder becomeFirstResponder]; return;
        }
        else if (responder.isFirstResponder) {
            firstResponder = responder;
        }
    }

    [controls.firstObject becomeFirstResponder];
}

- (void)tabBackward:(UIKeyCommand *)command
{
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;

    for (UIResponder *const responder in controls.reverseObjectEnumerator) {
        if (firstResponder != nil && responder.canBecomeFirstResponder) {
            [responder becomeFirstResponder]; return;
        }
        else if (responder.isFirstResponder) {
            firstResponder = responder;
        }
    }

    [controls.lastObject becomeFirstResponder];
}

可以预先显示用于滚动屏幕外响应者的其他逻辑。

这种方法的另一个优点是您不需要子类化您可能想要显示的各种控件(如UITextField s),而是可以在控制器级别管理逻辑,其中,让&老实说,这是正确的地方