iOS学习开发iOS程序猿iOS收藏

一个Xib里面创建两种不同的cell及一些关于tableview

2016-09-13  本文已影响361人  Jinkuro

1.UITableView的复用机制

首先我们看苹果所给出的优化方案:

TableViewCell有一个缓存池机制,如果cell完全移出了视线外(即屏幕之外),则将这个cell存放到缓存池之中,等待复用;

为了区别每一种不同的cell,将每种不同的cell绑定上一个identifier,在显示新的cell的时候,delegate会通过identifier决定出现哪种cell;

UITableView每当显示一个新的cell的时候,都会去调用其Delegate的方法

    - (UItableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    }

方式一:

通常的做法是,从缓存池里面寻找,是否有可以循环利用的cell?

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

如果没有,就重新创建一个新的cell,这个cell在创建的时候,需要绑定一个identifier;

    if (cell == nil) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
            }

注意这个identifier,由于这个返回cell的方法调用非常频繁,最好将其用一个静态变量存放起来,避免重复开辟内存;

(被static修饰的局部变量只会初始化一次,在整个程序的运行中只有一份内存)

    static NSString *identifier = @"cell";

方式二:

如果没有cell,也可以在viewDidLoad的时候,进行注册,告诉TableView:将要用到cell的时候,就创建这个类型及这个标识的cell;

可以注册class或者Nib的cell;

    [self.newsTableView registerNib:[UINib nibWithNibName:@"JMTableViewCell" bundle:nil] forCellReuseIdentifier:@"cell"];

2.一个Xib里面创建两种不同的cell,然后在一个tableView里面使用

这个方法比较特殊,在自建的TableViewCell的Xib里面,可以拖入多个cell,cell的顺序要看左边栏的顺序,即最上面的是0,下面一个是1,等等;

如图

idenAndCell.png

在这个方法中,不采用注册的方法,只需在返回cell的方法中进行标识区分即可;

这样做可以有效地减少工作量,避免新建另一个Xib,而数据又和别的Xib的数据一样;这种重复劳动显然是不必要的

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        //model对应数据源的数组顺序
        JMNewsModel *model = [[JMNewsModel alloc]init];
        model = self.dataArray[indexPath.row];
        //创建cell
        JMNewsTableViewCell *cell = [[JMNewsTableViewCell alloc]init];
        //根据img_type来确定是哪种cell
        //复用和创建都嵌入if内部
        if (model.img_type == 2) {
            cell = [tableView dequeueReusableCellWithIdentifier:@"iden"];
            if (!cell) {
                cell = [[[NSBundle mainBundle]loadNibNamed:@"JMNewsTableViewCell" owner:nil options:nil]objectAtIndex:1];
            }
        }else if (model.img_type == 0) {
            cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
            if (!cell) {
                cell = [[[NSBundle mainBundle]loadNibNamed:@"JMNewsTableViewCell" owner:nil options:nil]objectAtIndex:0];
            }
        }
        //cell的数据赋值
        cell.model = model;
        return cell;
    }
上一篇下一篇

猜你喜欢

热点阅读