使用 UITableView 的可变高度自定义单元格调用 reloadData 时保持 UITableView 的当前位置

Posted

技术标签:

【中文标题】使用 UITableView 的可变高度自定义单元格调用 reloadData 时保持 UITableView 的当前位置【英文标题】:Maintain current position of UITableView while calling reloadData with variable height custom cells of UITableView 【发布时间】:2016-10-21 07:29:04 【问题描述】:

我的 UITableView 具有可变高度的自定义单元格和多个未固定的部分,我正在尝试在用户到达第一个单元格时实现加载更多功能。

获取数据后,我将记录排列到 NSMutableArray 中,其中包含多维数组来存储数据部分。

我的问题是,当我加载更多数据时,我不知道每个部分中有多少个部分和多少行。所以我无法使用 scrollToRowAtIndexPathscrollRectToVisible

等方法添加固定值以将我的 UITableView 移动到特定位置

所以每次获得新记录后,我都会调用 reloadData 来更新我的 number Of Sectionsnumber Of Rows In Each Section,这也将控件移动到 UITableView 的第一行。我想出现在当前查看单元而不是第一个单元。

我也尝试过reloadData() of UITableView with Dynamic cell heights causes jumpy scrolling 这个问题的答案,但这对我没有帮助。

【问题讨论】:

当您到达 TableView 的顶部或底部时会调用您的 load more? TableView 顶部。 您的意思是您希望在获取新项目之前保持在第一行,因为这些新项目在获取之后会位于顶部? 我的意思是我想在顶部追加新行后留在同一行,例如。如果总记录为 20 时我在第 1 行,那么如果我在顶部获取并追加 20 行,那么现在我在表中的新位置是 21。 【参考方案1】:

如果您想保持在同一位置,请不要使用reloadData。请改用reloadRowsAtIndexPathsinsertRowsAtIndexPathsreloadSections

用动画刷新修改的行:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourModifiedCell] withRowAnimation: UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];

添加动画行(行数自动增加):

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexPathOfYourNewCell] withRowAnimation: UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];

没有动画(未经测试):

[UIView performWithoutAnimation:^
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:@[indexPathOfYourNewCell] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];
];

Apple 文档:description here

【讨论】:

我想你不明白我的问题你错过了什么,没有打电话给reloadData你如何更新你的tableviewnumberOfRowsnumberOfSection @DhavalDobariya 我刚刚将reloadRowsAtIndexPaths 更改为insertRowsAtIndexPaths。它正确地完成了这项工作,Apple 在给定的链接中记录了它。 @DhavalDobariya 这里的代码不会重新加载您的tableView。它只是在您的tableView 中添加了更多的部分和行,甚至您可以重新加载单个特定的部分/单元格,而不是重新加载完整的 tableView @Cœur 您是否尝试过对其高度没有限制的动态高度单元格。因为我只在这种情况下面临问题。我也用beginUpdates, endUpdates, insertRowsAtIndexPaths and insertSections 方法再试一次。但我仍然有同样的问题。 @DhavalDobariya 我个人使用故事板原型单元、自动布局和 Swift。为了触发自动行高,我在viewDidLoad 中使用tableView.estimatedRowHeight = 60。这个值为60 的代码技巧似乎很重要,因为没有其他东西对我有用。

以上是关于使用 UITableView 的可变高度自定义单元格调用 reloadData 时保持 UITableView 的当前位置的主要内容,如果未能解决你的问题,请参考以下文章

UITableView - 我们正在考虑意外折叠并改用标准高度

当单元格获得自定义高度时如何自定义 UITableView 分隔符

具有静态单元的 UItableView 包含 2 个 UItableview,每个都有具有动态高度的自定义单元

uitableview 自动布局自定义单元格导致额外高度

Xcode UITableView 自定义单元格xib 图像高度

UITableView 自定义单元格高度未正确管理 swift 中的动态约束