1

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

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

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

澄清: 有没有办法在不为每种类型的视图控制器添加特定代码的情况下做到这一点?(添加通用代码是可以接受的)

4

3 回答 3

2

我想写下我是如何解决这个问题的,这里有很多很好的答案:)

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

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

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

于 2013-08-27T11:06:22.113 回答
0

您可以在实用程序类中有一个方法,该方法将文本字段和视图控制器作为参数。然后您可以使用文本字段的“标签”属性来查找该 viewcotroller 中的下一个文本字段,假设您相应地分配了标签。数字会很棒,我想。vc 中的一个简单回调方法可以处理焦点更改。这和我现在看到的一样通用。

于 2013-06-30T13:57:00.403 回答
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;
    }
}

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

self.view1)递归查找所有子视图

2) 做一些检查数组是空的还是 nil 或者其中只有一个对象。

祝你好运!

于 2013-06-30T14:40:07.003 回答