UITableViewCell的基本用法
一、UITableViewCell简介
UITableView的每一行都是一个 UITableViewCell ,通过 dataSource 的 tableView:cellForRowAtIndexPath: 方法来初始化每一行
UITableViewCell是UIView的子类,内部有个默认的子视图:contentView。contentView是UITableViewCell显示内容的父视图,并负责显示一些辅助指示视图。辅助指示视图的作用是显示一个表示动作的图标,可以通过设置 UITableViewCell 的 accessoryType 来显示,默认是UITableViewCellAccessoryNone,即不显示辅助指示视图 ,其他值如下:
UITableViewCellAccessoryDisclosureIndicator
UITableViewCellAccessoryDetailDisclosureButton
UITableViewCellAccessoryCheckmark
二、UITableViewCell——contentView
contentView下默认有3个子视图,其中的2个是UILabel,通过textLabel和detailTextLabel属性访问,第3个是UIImageView,通过imageView属性访问
UITableViewCell的UITableViewCellStyle,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置,对应样式如下:
UITableViewCellStyleDefault
UITableViewCellStyleSubtitle
UITableViewCellStyleValue1
UITableViewCellStyleValue2
三、UITableViewCell对象的重用原理
这个部分和android的ListView、GridView等控件类似。
1.为什么要重用
iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象
2.重用的原理
重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
3.注意事项
还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell(如短信聊天布局),所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell
4.注意事项的解决方案
解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象
5.关于UITableView性能优化使用的提示
1.创建UITableViewCell时,必须设置一个唯一标示
2.去缓存池取出UITableViewCell时,必须传入一个标示
四、基本的重用案例
1.代码
//
// ViewController.m
// 03_UIView19_UITableVIew4_cell重用
//
// Created by 杞文明 on 16/1/2.
// Copyright © 2016年 杞文明. All rights reserved.
//
#import "ViewController.h"
@interface ViewController (){
UITableView * _tableView;
//数据
NSMutableArray* _dataListM;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self createTableView];
[self loadData];
}
/**创建UITableView*/
-(void)createTableView{
//1.初始化
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds];
//2.设置数据源
[_tableView setDataSource:self];
//3.设置代理
[_tableView setDelegate:self];
//4.添加到view中
[self.view addSubview:_tableView];
}
/**数据初始化*/
-(void)loadData{
_dataListM = [[NSMutableArray alloc]init];
for (NSInteger i=1; i<=10000; i++) {
NSString* itemStr = [NSString stringWithFormat:@"这是item %05ld",i];
[_dataListM addObject:itemStr];
}
}
/**返回总共拥有多少行*/
-(NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSLog(@"numbers ==================");
return _dataListM.count;
}
/**每个view的显示 重用*/
-(UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath{
//1.设置一个标示符
static NSString* identifier = @"UITalbeViewCell";
//2.到缓存池中查找有木有拥有这个这个标示符的可用对象
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
//3.如果没有创建一个
if(cell==nil){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
//4.设置数据
cell.textLabel.text = _dataListM[indexPath.row];
//5.我们打印一下对象的地址
NSLog(@"cell---%p-----%ld----String--%p",cell,indexPath.row,identifier);
//6.放回
return cell;
}
@end