打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
storyboard中用xib文件创建定制的UITableViewCell对象
分类: IOS开发 2012-08-17 01:32 5818人阅读 评论(0) 收藏 举报

      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中载入时,我给一段我的代码

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  2. {  
  3.     NSString *CellIdentifier ;  
  4.     UITableViewCell *cell;  
  5.     //自己子类化的UITableViewCell  
  6.     LableSwitchXibCell * lableSwitchCell;  
  7.     UINib *n;  
  8.     if ([indexPath section ] == 0 ) {  
  9.         CellIdentifier = @"LableSwitchXibCell";  
  10.         lableSwitchCell  = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
  11.         if (lableSwitchCell == nil) {  
  12.             NSArray *_nib=[[NSBundle mainBundle] loadNibNamed:@"LableSwitchCell"   
  13.                                                         owner:self  options:nil];  
  14.             lableSwitchCell  = [_nib objectAtIndex:0];  
  15.             //通过这段代码,来完成LableSwitchXibCell的ReuseIdentifier的设置  
  16.             //这里是比较容易忽视的,若没有此段,再次载入LableSwitchXibCell时,dequeueReusableCellWithIdentifier:的值依然为nil  
  17.             n= [UINib nibWithNibName:@"LableSwitchCell" bundle:[NSBundle mainBundle]];  
  18.             [self.tableView registerNib:n forCellReuseIdentifier:@"LableSwitchXibCell"];  
  19.         }  
  20.     }  
  21.   
  22. }  


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


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
iOS中tableView和自定义tableViewCell的使用方法总结
iOS中使用UItableviewcell实现团购和微博界面的示例
动态计算UITableViewCell高度详解 | 程序员头条
iOS最全性能优化(上)
UITableView之单元格内容重叠
一行代码设置 UITableViewCell 与导航条间距
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服