storyboard中用xib文件创建定制的UITableViewCell对象

      IOS5.0之后,在UITableView里可直接绘制自定义的UITableViewCell,还不会自定义UITableViewCell,直接传送门。要记得的是storyboard中的identifier(标识)一定要和代码中一致,用起来直观方便,似乎原来从xib(nib)文件中读取的时代,已经一去不复返了。但假设我们有UITableViewA和UITableViewB,我们在UITableViewA中自定义了好几个UITableViewCell,现在我们要在UITableViewB中重用这些现成的UITableViewCell,比较理想的方法就是在UITableViewB中使用identifier创建,但是不行,因为在UITableViewA中正常使用的dequeueReusableCellWithIdentifier:在UITableViewB返回的竟是nil。

       这里我们首先了解下identifier的作用,每一个UITableViewCell都会有一个reuseIdentifier(重用标识),当配置了reuseIdentifier,UITableView会将这个对象连同reuseIdentifier一起放到自己对象池里,当再次创建UITableViewCell对象时,UITableView会先在对象池中匹配是否已经创建过这个对象,若创建了,则不再重新创建(如果重复创建,当UITableView行数较多时,会耗光IOS的内存),直接返回之前已创建的对象。因此,我们通过UITableViewA创建的UITableViewCell,在UITableViewA对象池中,已经按我们定义的identifierA,完成重用,但其作用范围仅在UITableViewA的对象池内,当我们调用UITableViewB,其 list of UITableViewCell objects 还是空的,所以其返回值肯定为空。这里我也大胆的猜测一下storyboard在载入UITableViewA时,会自动将它的UITableViewCell(我们定制的)的界面资源载入一次,所以我们可以直接调用dequeueReusableCellWithIdentifier: .


       既然不能直接调用,我们只能走回通过xib文件的老路了,在xcode中继续创建xib文件,然后子类化UITableViewCell,并与xib文件相关联,在UITableView中载入时,我给一段我的代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier ;
    UITableViewCell *cell;
    //自己子类化的UITableViewCell
    LableSwitchXibCell * lableSwitchCell;
    UINib *n;
    if ([indexPath section ] == 0 ) {
        CellIdentifier = @"LableSwitchXibCell";
        lableSwitchCell  = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (lableSwitchCell == nil) {
            NSArray *_nib=[[NSBundle mainBundle] loadNibNamed:@"LableSwitchCell" 
                                                        owner:self  options:nil];
            lableSwitchCell  = [_nib objectAtIndex:0];
            //通过这段代码,来完成LableSwitchXibCell的ReuseIdentifier的设置
            //这里是比较容易忽视的,若没有此段,再次载入LableSwitchXibCell时,dequeueReusableCellWithIdentifier:的值依然为nil
            n= [UINib nibWithNibName:@"LableSwitchCell" bundle:[NSBundle mainBundle]];
            [self.tableView registerNib:n forCellReuseIdentifier:@"LableSwitchXibCell"];
        }
    }

}


       需要注意的就是要调用IOS5.0加入的函数registerNib:forCellReuseIdentifier:,最后再总结一下,UITableViewCell的重用标识,并没有用一个全局的对象池,其是只对单个UITableView实例而言的重用标识,Demo有些大,我就不发了,有童鞋想要我再发。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值