美文网首页
tableViewCell 设置选中效果无效

tableViewCell 设置选中效果无效

作者: 王家薪 | 来源:发表于2017-11-10 21:09 被阅读564次

    我是在什么情况下设置cell选中无效的

    错误的代码大概是这样的

    @implementation TableViewCell
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    
        if (selected) {
            [self displaySelectedUI];
        }else {
            [self displayDefaultUI];
        }
    }
    

    我重写了cellsetSelected: animated:方法,在其中切换cell选中和非选中的样式.

    @implementation ViewController
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        NSModel *model;
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
        [cell setSelected:model.selected animated:NO]
    }
    

    我无需关心用户点击cellcell对于选中状态的切换,因为tableVIew已经做了默认操作,但是当刷新tableView时,之前的选中状态就不见了.
    为了保存选中状态不被刷新掉,我在模型中使用selected保存cell的选中状态,在tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath协议触发时使用[cell setSelected:model.selected animated:NO]恢复cell的选中状态
    运行的时候出现问题了.无论我做多少次尝试,选中状态就像没有保存一样,每次刷新就会恢复成未选中状态.

    解决办法

    原文地址:http://www.jianshu.com/p/0668ce0b46b8
    最终的解决方案是因为我看到评论中的这段话

    断忆残缘
    可以在主UI线程空闲时调用这个方法:- (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition,来设置选中

    于是我将代码做了以下更改

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        NSModel *model;
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    // 使用异步方法将设置cell选中状态推迟到tableView loadData完成
        dispatch_async(dispatch_get_main_queue(), ^{
            [cell setSelected:model.selected animated:NO]
        });
    }
    

    原因分析

    tableView reloadDate会将所有的cell恢复成未选中状态,任何在reloadData方法执行完毕之前设置的选中状态都会失效.所以使用异步的方式将设置选中状态推迟到下一次runLoop,这样cell的选中状态就不会被tableView重置

    相关文章

      网友评论

          本文标题:tableViewCell 设置选中效果无效

          本文链接:https://www.haomeiwen.com/subject/tssimxtx.html