有没有办法在动态 UITableView 上使用 UITextField,并在它们之间使用 'tab'?

Is there a way to use UITextField's on a dynamic UITableView, AND 'tab' between them?

这可能有点冗长,但请耐心等待。它主要是简单的代码和日志输出。通常,如果我想将 UITextField 作为 UITableViewCell 的一部分,我可能会使用 a) 静态行或 b) 我会在情节提要中创建单元格,输出单元格并将字段输出到我的 ViewController,然后将单元格拖到 "Table View" 之外,但将其保留在场景中。

但是,我需要创建一个视图,我可以在其中接受来自 28 个不同事物的输入。我不想输出 28 个不同的 UITextField。

我想动态地执行此操作,以使其更容易。所以我创建了一个带有标签和 UITextField 的自定义 UITableViewCell。

我的 ViewController 有两个数组。

@property (nonatomic, strong) NSArray *items;
@property (nonatomic, strong) NSArray *itemValues;

我的 cellForRowAtIndexPath 看起来像这样...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellIdentifier = @"ItemCell";
    MyItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell) {
        cell = [[MyItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.categoryValue.tag = indexPath.row;
        cell.categoryValue.delegate = self;
    } 

    cell.item.text = [self.items objectAtIndex:indexPath.row];
    cell.itemValue.text = [self.itemValues objectAtIndex:indexPath.row];

    return cell;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
        NSInteger tag = [textField tag];
        NSLog(@"TFSR tag: %zd/%zd", tag, self.categories.count-1);
        if (tag < (self.categories.count - 1)) {
            NSIndexPath *nextIndex = [NSIndexPath indexPathForRow:tag+1 inSection:0];
            NSLog(@"TFSR nextRow: %zd/%zd\n", nextIndex.row);
            FFFCategoryTableViewCell *cell = (MyItemTableViewCell *)[self.tableView cellForRowAtIndexPath:nextIndex];
            [self.tableView scrollToRowAtIndexPath:nextIndex atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
            [cell.categoryValue becomeFirstResponder];
        }
        else {
            NSLog(@"DONE!");
        }

    return YES;
}

这被证明是有问题的。目标是,用户应该能够 select 第一行的 UITextField,输入一个值,当他们按下键盘上的 'Next' 键时,他们将被发送到第一行的 UITextField第二行。然后是第3、4、...27、28

但是,假设我首先在 IndexPath.row = 11 的单元格上突出显示 UITextField。如果我点击 'Next',这就是我的输出结果...

======== OUTPUT ========

TFSR tag: 11/27
TFSR nextRow: 12/27

TFSR tag: 12/27
TFSR nextRow: 13/27

TFSR tag: 13/27
TFSR nextRow: 14/27

TFSR tag: 0/27
TFSR nextRow: 1/27

现在我完全明白为什么会这样了。 UITableView 试图在加载各种单元格时节省内存,并使用 dequeueReusableCellWithIdentifier ...我只有 14 个单元格(0-13)。然后循环回到开头。

我的问题是...我不知道这个问题的解决方案。我希望用户能够在第 28 行 UITextField 之前访问他的 Next。

任何ideas/solutions关于我如何能做到这一点?

问题出在您对标签的使用上。您只需在第一次创建单元格时设置标签。每次调用 cellForRowAtIndexPath: 时都需要设置它。你想要:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellIdentifier = @"ItemCell";
    MyItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell) {
        cell = [[MyItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.categoryValue.delegate = self;
    } 

    cell.categoryValue.tag = indexPath.row;
    cell.item.text = [self.items objectAtIndex:indexPath.row];
    cell.itemValue.text = [self.itemValues objectAtIndex:indexPath.row];

    return cell;
}

请注意,只有在行固定的情况下,将标签设置为索引路径才有效。如果您的 table 行更动态(有些可以添加、删除或重新排序),那么使用索引路径作为标记将失败,必须使用另一种方法。