您的位置:首页 > 产品设计 > UI/UE

iOS 关于UITableViewCell复用机制的理解

2014-12-26 23:45 239 查看
先说一句题外话,Apple官方建议不要在scrollview中嵌套scrollview。tableview也是scrollview的一种,不到万不得已时不要将它嵌到scrollview中。我们回到正题,UITableView是很高效的,与它的cell复用机制密不可分。cell复用指的是什么呢?通俗地说一下。假设我们的tableview中有10个cell,窗口只容得下前5个,每个cell都是一样的,复用id也一样。从初始位置开始慢镜头,把cell前上滑动一点点,此时第一个cell的一部分消失了,第五个cell露出了一部分,这时第一个cell并没有进入到复用池,池子是空的,第五个cell自然也就不能在复用池中找到可复用的cell,第五个cell执行了如下代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cacheCellId];
if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}

通过调试跟踪可以看到程序走到了if里面去。

当第五个cell完全显示出来,第一个cell也已经完全退出了窗口,这时第一个cell被放入到复用池。我们继续向上滑动,第六个cell将显示出来,它也要走上面的那段代码,但是它不会进入到if里面去,因为第一个cell已经在复用池中了,第六个cell可以复用第一个cell,而不需重新创建对象。

有时为了解决一些cell内容无法刷新的问题,我省去了cell复用的常规写法,每次都是建立一个新的cell,即去掉上面那段代码中if的部分。

else if (3 == indexPath.section) {
        //这里没有使用cell复用机制,为了解决登录按钮无法刷新title的问题
        UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
        
        //登录按钮
        float btnH = 39;
        float btnW = ScreenWidth - 40;
        UIButton *btnForLogin = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, btnW, btnH)];
        btnForLogin.layer.cornerRadius = 3.f;
        btnForLogin.center = cell.center;
        btnForLogin.backgroundColor = UIColorFromRGB_hex(0xbe8300);
        [btnForLogin setTitleColor:UIColorFromRGB_hex(0xf8f8f8) forState:UIControlStateNormal];
        [btnForLogin.titleLabel setFont:[UIFont fontWithName:@"黑体-简" size:16]];
        [btnForLogin setTitle:_btnForLoginTitle forState:UIControlStateNormal];
        [btnForLogin addTarget:self action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];
        
        [cell addSubview:btnForLogin];
        return cell;
    }


这个cell中装个一个登录按钮,用户登录状态下按钮显示“退出登录”,用户未登录状态下按钮显示“登录”,在按钮响应事件处理方法中对按钮的标题_btnForLoginTitle进行变换,然后执行[_tableViewreloadData];以使这个cell中按钮文字相应改变。结果是如果复用cell则按钮文字不能及时改变,每次创建新的cell则可解决问题,于是便投机取巧了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: