0

我需要检测 tableview 何时完成重新加载数据。有一个较旧的解决方案,您可以将 tableview 子类化,然后重载 reloadData 方法,但显然不再有效,因为现在在多个线程上处理表,并且在 cellForRowAtIndexPath 之前调用了 reloadData。

我的问题是,自从更改以来,这个问题是否有任何解决方案?

我的问题是当表重新加载其数据时,我丢失了指向 textField 的指针,因此我尝试设置为下一个文本字段(以自动关注下一个数据输入字段)的第一响应者丢失了。

4

3 回答 3

1

这本质上是@wain 答案的重复,但我想我会添加一些代码。

您可以保留对拥有活动文本字段的单元格的索引路径的引用(作为属性)。

然后,在 cellForRowAtIndexPath: 中是这样的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    //I would hold a reference to the text field as a property on a subclass of UITableViewCell so that you can check for whether it exists.

    if (!cell.textField) {

            cell.textField = [[UITextField alloc] initWithFrame:cell.contentView.frame];

            [cell.contentView addSubview:cell.textField];
        }

    return cell;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    UITableViewCell *cell = (UITableViewCell *)textField.superview.superview;

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    self.indexPathForActiveTextField = indexPath;
 }

- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
    MyTableViewCell *cell = (MyTableViewCell *)textField.superview.superview;

    NSIndexPath *ip = [self.tableView indexPathForCell:cell];

    [self.tableView reloadData];

    NSIndexPath *nextIndexPath = [NSIndexPath indexPathForRow:ip.row+1 inSection:ip.section];

    MyTableViewCell *theNewCell = (MyTableViewCell *)[self.tableView cellForRowAtIndexPath:nextIndexPath];

    if (theNewCell) {

        [theNewCell.textField becomeFirstResponder];
    }

    return YES;
}
于 2013-04-26T17:45:49.180 回答
0

存储NSIndexPath包含应该是第一响应者的文本字段的表格单元格。当您想更改第一响应者时,您可以向表格视图询问该索引路径处的单元格,然后找到文本字段并将其设为第一响应者。

如果表格视图重新加载,cellForRowAtIndexPath:请检查索引路径并使“新”文本字段成为第一响应者。

通过这种方式,您可以随时设置第一响应者,并且您不能丢失对它的引用,因为引用是一个位置,而不是一个对象(将被重用或删除)。

于 2013-04-26T17:32:09.513 回答
0

UITableView 使用一个池来重用显示的单元格。目标单元格可能在其他行中重复使用。像 Wain 建议的那样存储 NSIndexPath 是很好的,直到您不重新排序单元格或从数据源中删除某些条目。在模型中定义一个键,根据该键设置 firstResponder。希望我没有误解这个问题。

于 2013-04-26T17:48:07.550 回答