在 UITableViewController 中调用 "reloadData" 仍保留语义内容偏移的分类方法。
很多时候您 不 想使用带有动画的表格视图更新,但您 确实 想插入比当前内容偏移量上方的行。使用 reloadData
的问题在于它丢失了用户在内容中的当前位置。在这些情况下,应使用 JTSSemanticReload 分类。
在需要使用
- (void)reloadData;
的地方,代替为
- (void)JTS_reloadDataPreservingSemanticContentOffset:(JTSSemanticReloadItemForIndexPath)itemForPathBlock
pathForItemBlock:(JTSSemanticReloadIndexPathForItem)pathForItemBlock;
以下是示例实现
- (void)someDataModelDidUpdate:(id)model andStuff:(id)stuff {
[self JTS_reloadDataPreservingSemanticContentOffset:^id(NSIndexPath *indexPathPriorToReload, UITableViewCell *cellPriorToReload) {
return (SomeTweet *)[cellPriorToReload tweet];
} pathForItemBlock:^NSIndexPath *(id dataSourceItem) {
return [self.tweetController indexPathForTweet:(SomeTweet *)dataSourceItem];
}];
}
此方法接受两个块参数。这两个块是同步调用的,可多次调用。其中一个取前一个 NSIndexPath
和 UITableViewCell
,并返回数据源项。另一个取数据源项并返回新的/当前的 NSIndexPath
。数据源项可以是您希望的任何对象。是否有能力从数据源项中衍生化新的索引路由,反之亦然,取决于您的应用程序。例如,如果您正在编写一个 Twitter 客户端,数据源项可能是一条推文。
此方法与非零内容内边距的表格视图一起使用是安全的,包括头部视图和脚部视图。