iOS学习10--xib for cell 缓存与重用

        今天礼拜五,周末愉快呀!美好的时光,各位当然留给自己的个人学习啦。好,今天晚上就来回顾一下UItableview的cell。突然从语法说到了控件,确实有点快。不过当前是知识点的回顾,所以会快一些。

        在tableview中,cell有一个缓存机制,用于cell的重用,避免了过多了占用内存资源。如何去理解呢?比如一个tableview中包含了20个cell,如果没有使用cell的缓存机制,

那么程序运行过程中就会一下子申请了20个cell的内存。但是,很多时候,我们并没有一下子用到全部的cell,也就是说我们的手机屏幕往往显示的cell大概5-6个左右。但是我们

由于没有采用cell的缓冲机制,那些已经申请了的cell却没有显示,这个就占用了系统的资源了。

       使用cell的缓存机制,就是让需要显示的cell时,先从缓存中查找是否有当前显示的cel同一类的cell,如果有,就从缓存中取出。然后修改取出的那个cell的状态数据,这些数据就是之前显示的内容,后者其他一些表示状态的数据等等。修改后,就可以显示到屏幕上面,而不用再申请内存新建立一个cell了。如果找不到的话,当然要向系统申请这个类型的cell啦。

        在程序中我们是如何实现了呢?很简单,我们用xib来描述一个cell,然后设置这个cell的ID为某个ID,比如下面的 "cell".然后在

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

方法中每次在显示cell之前先去缓存中查找是否有这个ID的cell,有就拿过来用,没有就重新申请。


下面就展示了如何通过xib定义一个cell,然后使用cell的缓存机制使用cell。

1、当前我的工程的文件结构,很简单的。

iOS学习10--xib for cell 缓存与重用_第1张图片

2、通过xib文件简历一个cell,并命名该个xib文件的ID为“cell”


iOS学习10--xib for cell 缓存与重用_第2张图片


设置cell的ID



2、修改对应controller的。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 0.用static修饰的局部变量,只会初始化一次
    static NSString *ID = @"cell";//注意cell中,它的identifier设置为“cell”
    
    // 1.拿到一个标识先去缓存池中查找对应的Cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    // 2.如果缓存池中没有,才需要传入一个标识创建新的Cell
    if (cell == nil) {
        // 通过xib文件来加载cell
        NSBundle *bundle = [NSBundle mainBundle];//加载cell的xib 文件
        NSArray *objs = [bundle loadNibNamed:@"BookCell" owner:nil options:nil];
        cell = [objs lastObject];
        
        UIButton *btn = (UIButton *)[cell viewWithTag:13];//通过tag获取cell中的控件成员
        
        [btn addTarget:self action:@selector(phase:Event:) forControlEvents:UIControlEventTouchUpInside];//添加对应按钮的方法
    }
    //下面是比较重要的两个地方,一个先更改状态,就是从当前的indexpath.row中获取需要显示的cell,
    //然后刷新需要显示的cell的数据,最后返回需要显示cell
    Book *b = self.books[indexPath.row];
    
    UILabel *nameLabel = (UILabel *)[cell viewWithTag:11];
    nameLabel.text = b.name;
    
    
    UILabel *priceLabel = (UILabel *)[cell viewWithTag:12];
    priceLabel.text = [NSString stringWithFormat:@"$%d",b.price];
    
    
    return cell;
}


总结:从上面的代码注释可以知道,是如何使用cell的缓存机制的.只是需要几个方法就可以了。

我觉得比较中的是,从缓存中取出cell的时候需要重新根据自己的需要改变这个cell的状态数据。

PS:工程后面补上。

你可能感兴趣的:(IOS学习)