iOS cell的复用以及自定义cell

打印 上一主题 下一主题

主题 843|帖子 843|积分 2529

自定义cell以及cell复用的内容


  
媒介

cell是我们开辟中的一个重要的控件,下面来讲解一下这个内容
cell的复用原理

cell的复用是UITableView的最核心的内容,这里解释一下他的一个复用原理:
   初始化的时间他会先创建cell的缓存字典 和 section的缓存array,以及一个用于存放复用cell的mutableSet(可变的聚集)。并且它会去创建显示的(n+1)个cell,其他都是从中取出来重用。
  当有cell滑出屏幕时,会将其放入到一个set中(相称于一个重用池),当UITableView要求返回cell的时间,datasource会先在聚会合查找是否有闲置的cell,若有则会将数据设置到这个cell中,并将cell返回给UITabelView。 这大大减少了内存的开销。
  由于我在滚动的过程中会出现一个将cell滚出屏幕外的时间,这时间如果我们一直创建cell的话,如果cell太多了就会出现一个内存开销过多的一个问题。以是我们要采用这个复用的方式来提高内存利用率。
  在表视图显示的时间,会创建(视图中可看的单位格个数+1)个单位格,一旦单位格由于滑动的而消失在我们的视野中的时间,消失的单位格就会进入缓存池(或叫复用池),当有新的单位格必要显示的时间,会先从缓存池中取可用的单位格,获取乐成则利用获取到的单位格,获取失败则重新创建新的单位格,这就是整个的复用机制。
cell的复用的两种不同方式

接下来讲一下·cell的两种复用方式,重要分成注册和非注册两种方式。
注册
  1. - (void)viewDidLoad {
  2.     [super viewDidLoad];
  3.     self.tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped];
  4.     self.tableView.delegate = self;
  5.     self.tableView.dataSource = self;
  6.     self.ary = @[@"头像", @"名字", @"微信号"];
  7.     [self.view addSubview:_tableView];
  8.     [self.tableView registerClass:[cell02 class] forCellReuseIdentifier:@"cell"]; //使用代码自定义cell
  9.     // Do any additional setup after loading the view.
  10. }
  11. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  12.     cell02* cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
  13.     return cell;
  14. }
复制代码
非注册
  1. - (void)viewDidLoad {
  2.     [super viewDidLoad];
  3.     _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style: UITableViewStyleGrouped];
  4.     //设置两个代理
  5.     _tableView.delegate = self;
  6.     _tableView.dataSource = self;
  7.     [self.view addSubview:_tableView];
  8.     // Do any additional setup after loading the view.
  9. }
  10. -(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  11.     NSString* cellStr = @"cell";
  12.     UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellStr];
  13.     if (cell == nil) {
  14.         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellStr];
  15.     }
  16.     return cell;
  17.    
复制代码
这两种方式都是可以实现复用的,两者有部分的区别,这里引用一段学长博客的话:
   上述代码的区别在于注册方法必要提前对我们要利用的cell类举行注册,云云一来就不必要在后续过程中对我们的单位格举行判空。
这是由于我们的注册方法:
  

  • (void)registerClassnullable Class)cellClass forCellReuseIdentifierNSString *)identifier API_AVAILABLE(ios(6.0));
    在调用过程中会主动返回一个单位格实例,云云一来我们就制止了判空操作
  区别2:
   引用的方法不同
  

  • - (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifierNSString *)identifier;
  • (__kindof UITableViewCell *)dequeueReusableCellWithIdentifierNSString *)identifier forIndexPathNSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
  前者用于非注册的方式,后者用于注册的方式中。在写代码的时间注意逐一对应。
自定义cell的实现

我们首先要实现自定义cell必要实现两个协议:
UITableViewDelegateUITableViewDataSource
前者的重要用于实现显示单位格,设置单位格的行高和对于订定的单位格的操作设置头视图和尾视图。
  1. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
  2. - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section API_AVAILABLE(ios(6.0));
  3. - (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section API_AVAILABLE(ios(6.0));
  4. - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath API_AVAILABLE(ios(6.0));
  5. - (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section API_AVAILABLE(ios(6.0));
  6. - (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section API_AVAILABLE(ios(6.0));
  7. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
  8. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
  9. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
复制代码
后者重要用于设置UITableView的section和row的数量
  1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
  2. // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
  3. // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
  4. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
复制代码
我们的UIVIewContorller中要实现上面的部分协议函数,背面就是我们有关自定义cell的核心部分,就是我们的自定义的cell的类的部分。
我们自定义cell先要创建一个类继续UITableViewCell
  1. #import <UIKit/UIKit.h>
  2. NS_ASSUME_NONNULL_BEGIN
  3. @interface myCustomCell : UITableViewCell  //在这里设置我们自己需要的一些UI控件
  4. @property (nonatomic, strong) UIButton* btn;
  5. @property (nonatomic, strong) UILabel* label1;
  6. @property (nonatomic, strong) UILabel* label2;
  7. @property (nonatomic, strong) UIImageView* imageView01;
  8. @end
  9. NS_ASSUME_NONNULL_END
复制代码
然后必要重写一个方法- (instancetype)initWithStyleUITableViewCellStyle)style reuseIdentifierNSString *)reuseIdentifier
  1. -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
  2.     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  3.     if ([self.reuseIdentifier isEqualToString:@"picture"]) {
  4.         _label1 = [[UILabel alloc] init];
  5.         _label1.textColor = UIColor.blackColor;
  6.         _label1.font = [UIFont systemFontOfSize:17];
  7.         [self.contentView addSubview:_label1];
  8.         
  9.         _label2 = [[UILabel alloc] init];
  10.         _label2.textColor = UIColor.grayColor;
  11.         _label2.font = [UIFont systemFontOfSize:10];
  12.         [self.contentView addSubview:_label2];
  13.         
  14.         _imageView01 = [[UIImageView alloc] init]; // 创建UIImageView对象
  15.         [self.contentView addSubview:_imageView01];
  16.         
  17.         _btn = [UIButton buttonWithType:UIButtonTypeCustom];
  18.         [self.contentView addSubview:_btn];
  19.     }
  20.     return self;
  21. }
复制代码
最后设置一个结构
  1. -(void)layoutSubviews {
  2.     //设置一下自己ui控件的frame
  3. }
复制代码
这样就可以实现我们的一个自定义cell的内容了。
总结

这里简单介绍了一下有关自定义cell的内容和cell复用的原理。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表