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,等等;
如图
在这个方法中,不采用注册的方法,只需在返回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;
}