有没有办法在动态 UITableView 上使用 UITextField,并在它们之间使用“选项卡”?

Posted

技术标签:

【中文标题】有没有办法在动态 UITableView 上使用 UITextField,并在它们之间使用“选项卡”?【英文标题】:Is there a way to use UITextField's on a dynamic UITableView, AND 'tab' between them? 【发布时间】:2015-03-14 00:25:51 【问题描述】:

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

但是,我需要创建一个视图,我可以在其中接受来自 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;

这被证明是有问题的。目标是,用户应该能够选择第一行的 UITextField,输入一个值,当他们点击键盘上的“下一步”键时,它们将被发送到第二行的 UITextField。然后是第 3 次、第 4 次、第 27 次、第 28 次。

但是,假设我首先在 IndexPath.row = 11 的单元格上突出显示 UITextField。如果我点击“下一步”,这就是我的输出的样子...

======== 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 行之前进行下一步。

关于如何实现这一目标的任何想法/解决方案?

【问题讨论】:

【参考方案1】:

问题在于您对标签的使用。您只需在第一次创建单元格时设置标签。每次调用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;

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

【讨论】:

以上是关于有没有办法在动态 UITableView 上使用 UITextField,并在它们之间使用“选项卡”?的主要内容,如果未能解决你的问题,请参考以下文章

不使用 AutoLayout 的 UITableView 动态行高

在XIB文件中添加带有动态内容的UITableView

iOS UITableView reloadData 导致键盘收起不能连续输入问题解决办法

如何使用swift在ios中动态/编程添加多个UITableView? [关闭]

有没有办法在有限的框架上显示 Uitableviewcell 选择?

有没有办法不显示分组 UITableView 中每个部分的顶部和底部单元格的圆角?