開發中,經常遇到一個頁面兩個tableView的情況,如圖:
進入頁面時預設選中左邊的leftTableView的第一行"24h降水"這一行.實作這種效果比較友善的方式有兩種思路:
思路都是基于通過cell的選中狀态來控制label的字型顔色,cell的selected狀态改變時,label的字型顔色自然也就會跟着變化
1.通過tableView層級控制cell的選中狀态,即手動調用tableView的selectRowAtIndexpath方法:
[self.leftTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];
這種方式需要在tableView reloadData之後調用,效果是預設選中第一行資料.此外,由于右邊的tableView資料是跟左邊關聯的,是以首次進入頁面還需要手動請求一次資料,來重新整理右邊rightTableView.
需要注意的是:手動調用selectRowAtIndexPath并不會自動繼續調用didSelectRowAtIndexPath代理方法.didSelectRowAtIndexPath方法一般隻在手動點選cell的時候才會調用.(PS:蘋果并不認為didSelectRowAtIndexPath由手動點選cell之外的方式觸發是合理的)手動改變cell的selected狀态也不會導緻調用didSelectRowAtIndexPath
是以上面的代碼還要加上一句,兩句配合起來使用就能達到效果:
[self tableView:self.leftTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]
在didSelectRowAtIndexPath方法中請求rightTableView的資料并reload rightTableView
2.通過cell層級控制cell的選中狀态,即手動調用cell的setSelected方法:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if([tableView isEqual:self.leftTableView]){
if(indexPath.row==0){
[cell setSelected:YES animated:YES];
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}
}
}
需要注意的問題是:在cellForRow中調用cell的setSelected方法是沒用的.雖然調用cell的setSelected方法會進入cell中去根據cell的selected設定label的顔色,但在這之後,又将自動調用一次cell的setSecleted方法,而且參數selected的值為NO,是以,即便剛剛設定了正确的label顔色,接下來又會被第二次自動調用的setSelected方法覆寫.最合适的調用時機是willDisplayRow代理方法中.
另外,在調用cell的setSelected方法後,還必須調用tableView的SelectRowAtIndexPath方法.否則你會發現這樣一個問題,雖然進入頁面時預設第一行cell選中了,但是你點選第二行時,第一行cell的選中狀态并沒有解除,而且打斷點發現,連didDeselectRow方法也不進了.(PS:個人推測,tableView會對cell的選中狀态做統一處理,didSelectRowAtIndexPath和didDeselectRowAtIndexPath成對出現才能合理控制cell的selected狀态)
綜上,最合理的辦法就是第一種思路,在控制器層級控制cell的selected狀态,即:
[self tableView:self.leftTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
[self.leftTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];