iOS tableView 的 cell上其它控件重用(利用view的tag属性巧妙实现重用,从xib中加在cell重载问题)

项目上经常需要定制tableView的cell,比如今天会想在cell上另外添加label记录此cell所在的行数,因为cell的重用机制是系统已经设置好了的,可以按以下方式进行:

    static NSString *CellIdentifier = @"tableViewCellReuseID";

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    

    if (cell == nil)

    {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle

                                      reuseIdentifier:CellIdentifier];

        cell.selectionStyle = UITableViewCellSelectionStyleBlue;

        cell.accessoryType  = UITableViewCellAccessoryNone;

/*

        CGRect cellFrame  = cell.frame;

        CGRect labelFrame = CGRectMake(cellFrame.size.width - 25, cellFrame.origin.y, 20, cellFrame.size.height);

        _countLabel = [[UILabel alloc] initWithFrame:labelFrame];

        CGPoint tmpCenter = _countLabel.center;

        tmpCenter.y = cell.bounds.size.height / 2;

        _countLabel.center = tmpCenter;

        [cell addSubview:_countLabel];


*/

    }

       但是新添加的label不能像上面红色字体显示的代码那样直接在这个 if 语句里alloc,然后直接在外面使用,那样的话每次就只会重用最后定义的label,所显示的数目肯定会有问题。

这个时候我们可以使用label的tag属性。只需简单的在上述红色语句里添加:

        _countLabel.tag = 101;

再在 if 语句外面按以下方式提取出来:

    _countLabel = (UILabel*)[cell viewWithTag:101];

之后就可以随便使用了。之前也了解这个机制,也知道可以这么做,但是其原理没有吃透,不知道为什么这样就可以实现重用了。今天听老大讲解了下,恍然大悟,一下子就明白了。
其实关键就在 [cell viewWithTag:101]; cell的这个方法的调用上,以前没有理解这个方法的真正含义。这个方法是提取 cell 及它上面的任何 view 的 tag 为101的view。当然必须 tag 能够唯一标识这个view。上面语句给每个cell 都安装一个tag 为101 的label,这样并不会重复而无法识别,因为每次取出来的cell 是确定的,该cell 上只有一个(唯一的)tag 为101的label,那在该cell 上tag 为101 的label 也就随之而定。于是搭载cell的重用机制,该label 也间接的被重用了。这是上述方法为什么能够实现重用的根本原因。

    就这个问题,我在查资料的时候还了解了另一个重用的问题。有时候我们的cell并不是用代码重建的,而是从xib上加载上来的,那这个时候又改怎么实现cell 的重用呢?可以按照以下方式实现:

static NSString *CellIdentifier = @"Cell";

        BOOL nibsRegistered = NO;

        if (!nibsRegistered) {

            UINib *nib = [UINib nibWithNibName:NSStringFromClass([Cell class]) bundle:nil];

            

    [tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];


            nibsRegistered = YES;

        }

        Cell *cell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        cell.titleLabel.text = [self.dataList objectAtIndex:indexPath.row];

        return cell;


关键代码即是上述被加粗的代码。转载于 这里





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值