Q:
場(chǎng)景是茧跋,數(shù)據(jù)回來(lái)慰丛,[self.tableView reloadData] 時(shí),想讓他回到列表頂部瘾杭;之前沒(méi)注意過(guò)這個(gè)問(wèn)題诅病,今天發(fā)現(xiàn) reloadData 時(shí)候,用 scrollToTop粥烁,或者 setContentOffset 并沒(méi)有生效贤笆。最后解決辦法如下。建議盡量用方案1-1讨阻,1-2芥永;
A:
方案1-1:
這種方法,僅適用于 tableView 沒(méi)有設(shè)置 tableHeaderView 的情況钝吮。animated 可自行選擇 YES/NO埋涧,reloadData 放前面也行,放后面也行奇瘦,為所以為棘催。
不過(guò)這里得注意判斷這里的 section:0 是不是有 cell,也就是下面這個(gè) if()耳标。如果根本就沒(méi)cell醇坝,卻還要 scrollTo 的話(huà),那就蹦薩卡拉卡了??
UITableViewScrollPositionTop 意思是把指定 indexPath 的 cell 放到屏幕最頂上次坡,所以會(huì)導(dǎo)致 header 被頂上去蓋住呼猪。
[self.tableView reloadData];
if ([self.tableView numberOfRowsInSection:0]) {
NSIndexPath *indexPathOne = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPathOne atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
方案1-2:
這種適用于有 tableHeaderView,但是 header 不太高的情況砸琅,UITableViewScrollPositionMiddle 意思是把指定 indexPath 的 cell 放到屏幕中央郑叠,所以會(huì)把 cell 盡量往下拉,就可以正常展示出 header明棍。
[self.tableView reloadData];
if ([self.tableView numberOfRowsInSection:0]) {
NSIndexPath *indexPathOne = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPathOne atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}
方案2:
這種方法比較通用乡革,有沒(méi)有 tableHeaderView 都可以,不過(guò)缺點(diǎn)是這里的 animated 一定要為 NO摊腋,否則某些情況下不生效沸版。
[UIView animateWithDuration:0 animations:^{
[self.tableView setContentOffset:CGPointZero animated:NO];
} completion:^(BOOL finished) {
[self.tableView reloadData];
}];
??WARRING:
方案2 有一個(gè)隱藏問(wèn)題⌒苏簦回滾到最前面時(shí)视粮,你的 tableView 會(huì)加載前面的cell,這時(shí)候會(huì)調(diào)用 cellForRowAtIndexPath橙凳,以及 heightForRowAtIndexPath 等代理方法蕾殴;但是在這之前笑撞,你可能已經(jīng)刪掉了 dataSource 里的數(shù)據(jù),或者更換了 dataSource 里的數(shù)據(jù)钓觉,那么從 dataSource 數(shù)組取值時(shí)候茴肥,很可能會(huì)出現(xiàn)數(shù)組越界現(xiàn)象。
所以荡灾,建議一定要加好數(shù)組越界的判定處理叭亢!E稀础锐!