我是在什么情況下設(shè)置cell選中無效的
錯(cuò)誤的代碼大概是這樣的
@implementation TableViewCell
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
if (selected) {
[self displaySelectedUI];
}else {
[self displayDefaultUI];
}
}
我重寫了cell
的setSelected: animated:
方法,在其中切換cell
選中和非選中的樣式.
@implementation ViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSModel *model;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
[cell setSelected:model.selected animated:NO]
}
我無需關(guān)心用戶點(diǎn)擊cell
時(shí)cell
對(duì)于選中狀態(tài)的切換,因?yàn)?code>tableVIew已經(jīng)做了默認(rèn)操作,但是當(dāng)刷新tableView
時(shí),之前的選中狀態(tài)就不見了.
為了保存選中狀態(tài)不被刷新掉,我在模型中使用selected
保存cell
的選中狀態(tài),在tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
協(xié)議觸發(fā)時(shí)使用[cell setSelected:model.selected animated:NO]
恢復(fù)cell的選中狀態(tài)
運(yùn)行的時(shí)候出現(xiàn)問題了.無論我做多少次嘗試,選中狀態(tài)就像沒有保存一樣,每次刷新就會(huì)恢復(fù)成未選中狀態(tài).
解決辦法
原文地址:http://www.reibang.com/p/0668ce0b46b8
最終的解決方案是因?yàn)槲铱吹皆u(píng)論中的這段話
斷憶殘緣
可以在主UI線程空閑時(shí)調(diào)用這個(gè)方法:- (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition,來設(shè)置選中
于是我將代碼做了以下更改
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSModel *model;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
// 使用異步方法將設(shè)置cell選中狀態(tài)推遲到tableView loadData完成
dispatch_async(dispatch_get_main_queue(), ^{
[cell setSelected:model.selected animated:NO]
});
}
原因分析
tableView reloadDate
會(huì)將所有的cell
恢復(fù)成未選中狀態(tài),任何在reloadData
方法執(zhí)行完畢之前設(shè)置的選中狀態(tài)都會(huì)失效.所以使用異步的方式將設(shè)置選中狀態(tài)推遲到下一次runLoop
,這樣cell
的選中狀態(tài)就不會(huì)被tableView
重置