天天看點

tableView預設選中某一行,[cell setSelected:YES animated:YES]

開發中,經常遇到一個頁面兩個tableView的情況,如圖:

tableView預設選中某一行,[cell setSelected:YES animated:YES]

進入頁面時預設選中左邊的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];