当单元格未显示时,UITableView的scrollToRowAtIndexPath不起作用?

时间:2015-03-15 18:57:36

标签: objective-c uitableview cocoa-touch uitextfield

这比标题描述的更独特。

我在UITableView上动态显示了28个单元格。我选择动态地执行此操作,因为有很多,但我总是知道在加载时我会知道固定数量的行。

每个单元格上都有一个UITextField。

例如,当用户在第0行的UITextField上时,他们按下' Return'在键盘上,它是'标签'第1行中的UITextField。第2行,第3行的后续冲洗重复,依此类推。这很好用。但是,如果用户当前正在编辑的行在屏幕外滚动,则它不起作用。因此,例如,如果用户正在编辑第0行中的UITextField,则向下滚动UITableView以显示可见的显示行10-22作为任意示例,然后按下'返回'在键盘上,视图一直向上滚动,但第1行中的UITextField没有成为FirstResponder,键盘已经消失。

这是因为scrollToRowAtIndexPath代码动画需要时间吗?为什么这当前不起作用,如何让它工作,以便当UITableView滚动时,顺序的下一个UITextField将成为FirstResponder?

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [self.tableView reloadData];

    CGPoint textFieldOriginInTableView = [textField convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:textFieldOriginInTableView];

    NSLog(@"textFieldShouldReturn: %zd", indexPath.row);

    if (indexPath.row < (self.categories.count - 1)) {
        NSIndexPath *nextIndex = [NSIndexPath indexPathForRow:(indexPath.row+1) inSection:0];
        [self.tableView scrollToRowAtIndexPath:nextIndex atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
        MyCustomCell *cell = (MyCustomCell *)[self.tableView cellForRowAtIndexPath:nextIndex];
        [cell.categoryValue becomeFirstResponder];
    }
    else {
        [self doneTapped:self];
    }

    return YES;
}
编辑:我忘了在上面的OP中提到当前检索的indexPath总是正确的。无论我在UITableView中滚动的位置,上面代码中的NSLog语句总是返回正确的IndexPath.row。

1 个答案:

答案 0 :(得分:0)

在这种情况下,我会尝试跟踪nextIndexPath(属性或ivar),然后实现UITableViewDelegate协议的 - [tableView:willDisplayCell:forRowAtIndexPath:]方法,这样就可以检查正确的可见单元格。

另一种解决方案是当textField成为第一响应者时阻止用户在tableView上的交互。或者在滚动tableView时重新签名第一个响应者。这是一个更简单的解决方案,在我看来有更好的用户体验。