使用 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 中,其中包含多维数组来存储数据部分。
我的问题是,当我加载更多数据时,我不知道每个部分中有多少个部分和多少行。所以我无法使用 scrollToRowAtIndexPath 或 scrollRectToVisible
等方法添加固定值以将我的 UITableView 移动到特定位置所以每次获得新记录后,我都会调用 reloadData 来更新我的 number Of Sections 和 number 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
。请改用reloadRowsAtIndexPaths
或insertRowsAtIndexPaths
或reloadSections
。
用动画刷新修改的行:
[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
你如何更新你的tableviewnumberOfRows
和numberOfSection
?
@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,每个都有具有动态高度的自定义单元