UITableView 的 scrollToRowAtIndexPath 在单元格不显示时不起作用?

Posted

技术标签:

【中文标题】UITableView 的 scrollToRowAtIndexPath 在单元格不显示时不起作用?【英文标题】:UITableView's scrollToRowAtIndexPath does not work when the cell is not showing? 【发布时间】:2015-03-15 18:57:35 【问题描述】:

这比标题描述的更独特。

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

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

例如,当用户在第 0 行的 UITextField 上,并且他们按下键盘上的“返回”时,它会将“选项卡”到第 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】:

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

另一种解决方案是在 textField 成为第一响应者时阻止用户通过 tableView 进行交互。或者当 tableView 滚动时让第一响应者辞职。在我看来,这是一个更简单的解决方案,并且具有更好的用户体验。

【讨论】:

以上是关于UITableView 的 scrollToRowAtIndexPath 在单元格不显示时不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 分段控制和 UITableView

UITableView 从当前位置滚动到底部

如何在Swift中的UITableView中截取所选行的屏幕截图并将其保存为UIImage?

scrollToRow(at:at:animated:) SwiftUI

滚动到表视图标题顶部

swift - tableview 滚动到指定位置