iOS:自动选择文本字段之间的选项卡

时间:2013-06-30 13:17:13

标签: ios keyboard uitextfield

我有一个相对较大的iPhone应用程序,有很多视图。 我想在键盘上实现下一个/上一个选项。 我已经设法用UI实现它,我在网上看到了一些代码示例,但所有这些都假设我们需要为每个视图控制器添加代码以实现文本字段之间的实际转换。

我的问题是:有一般的方法可以知道,给定一些文本字段,谁是下一个字段? (即不重构我的每个视图控制器)

我问这个问题是因为当我使用iPhone模拟器并按下计算机的Tab键时 - 字段之间的切换发生了,所以我想知道是否有内置或通用的方式在iOS上实现它。

澄清: 有没有办法在不为每种类型的视图控制器添加特定代码的情况下执行此操作? (添加通用代码是可以接受的)

3 个答案:

答案 0 :(得分:2)

我想写一下我是如何在这里给出的许多好答案的帮助下解决这个问题的。)

首先,我无法创建完全通用的代码来创建选项卡,无论它在哪个视图中。 相反,我创建了这个东西,我认为这是最通用的解决方案,而firstResponder方法不起作用:

  • 我创建了自定义工具栏,其中包含我的下一个/上一个/完成按钮以及相应的操作委托。
  • 比通过添加类别“Tab”扩展UIViewController。此类别声明fieldsArray并实现委托方法。
  • 现在每个特定视图控制器需要做的事情(除了导入类别)是根据其属性提供此fieldsArray并调用init方法将按钮工具栏添加到此字段

我希望你能从中受益,并再次感谢所有好的答案

答案 1 :(得分:0)

您可以在实用程序类中使用一个方法,该方法将textfield和viewcontroller作为参数。那么您可以使用文本字段的“tag”属性来查找该viewcotroller中的下一个文本字段,假设您已相应地分配了标记。我想,数字会很棒。 vc中的简单回调方法可以处理焦点变化。这就像我现在所能看到的那样通用。

答案 2 :(得分:0)

这是我提出的一些通用代码:

// add a property for the fieldsArray

//add this in viewDidLoad
_fieldsArray = [[NSMutableArray alloc] init];
NSArray *viewsArray = [self.view subviews];
for (id view in viewsArray) {
    if ([view isKindOfClass:NSClassFromString(@"UITextField")]) {
        [_fieldsArray addObject:view];
    }
}

//add this in your action that switches the fields
for (UITextField *field in _fieldsArray) {
    if ([field isFirstResponder]) {
        if ([fieldsArray lastObject] == field) {
            [_fieldsArray[0] becomeFirstResponder];
        }else {
            NSUInteger nextIndex = [_fieldsArray indexOfObject:field] + 1;
            [_fieldsArray[nextIndex] becomeFirstResponder];
        }
        break;
    }
}

在使用它之前,应该进行改进。

1)递归查找self.view的所有子视图

2)如果数组为空或为零或者只有一个对象,则进行一些检查。

祝你好运!