一.UITableView 基本概述
UITableView 继承于UIScrollVIew,可以滚动.
UITableView 的每一条数据对应的单元格叫做Cell, 是UITableViewCell的一个对象,继承于UIView.
UITableView 可以分区显示, 每一个分区称为section, 每一行称为row, 编号都从0开始.
系统提供了一个专门的类来整合section和row, 叫做NSIndexPath.
section和row代表一个UITableViewCell在UITableView上的位置
二.UITableView的基本使用
/*
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
[self.view addSubview:tableView];
[tableView release];
*/
1.UITableView的样式枚举
UITableView的初始化方法包含一个UITableViewStyle类型的参数
这是一个枚举类型,分为两种UITableViewStylePain,UITableViewStyleGrouped.
2.UITableView显示的相关属性
rowHeight 行高
separatorStyle 分隔线样式
separatorColor 分隔线颜色
tableHeaderView UITableView的置顶视图
tableFooterView UITableView置底视图
三.UITableView显示数据
1.UITableView中有两个重要的属性:
@property (nonatomic, weak, nullable) id<UITableViewDataSource> dataSource; ------显示数据相关的代理
@property (nonatomic, weak, nullable) id<UITableViewDelegate> delegate; ------视图操作相关的代理
2.UITableView代理的实现代码
(1)签订UITableView协议
/*
@interface ViewController ( ) <UITableViewDataSource, UITableViewDelegate>
@end
*/
(2)设置当前的ViewController为UITableView代理
/*
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
// 设置dataSource代理
tableView.dataSource = self;
// 设置delegate代理
tableView.delegate = self;
[self.view addSubview:tableView];
[tableView release];
}
*/
UITableViewDataSource
UITableVIew的DataSource是负责给UITableView对象提供数据的代理,遵循UITableViewDataSource协议
UITableViewCell
UITableView的每一个单元格是UITableViewCell类的对象,继承于UIView.
UITableViewCell默认提供了3个视图属性:
四.UITableViewCell的重用机制
UITableView有一个重用机池机制管理cell,目的是使用尽可能少的cell显示所有数据.
1.UITableView重用cell的流程
(1)当一个cell被滑出屏幕,这个cell会被系统放到相应的重用池中.
(2)当tableView需要显示一个cell,会先去重用池中尝试获取一个cell.
(3)如果重用池没有cell,就会创建一个cell.
(4)取得cell之后会重新赋值进行使用.
2.UITableView重用cell的代码流程
(1)在创建UITableView之后,需要注册一个cell类,当重用池中没有cell的时候,系统可以自动创建cell. 相关方法:
/*
-(void)registerClass:(class)cellClass forCellReuseldentifier:(NSString *)identifier;
*/
(2)系统提供了一个获取重用池中cell的方法(需要提供一个重用标识):
/*
-(UITableViewCell *)dequeueReusableCellWithldentifier:(NSString *)identifier;
*/
3.修改后的UITableView代码
/*
-(void)viewDidLoad{
[super viewDidLoad];
/*创建tableView的代码*/
// 参数1: 当重用池没有cell的时候使用什么类创建Cell
// 参数2: 这个重用池的标识
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"reuse"];
}
*/
4.修改后的UITableViewDataSource协议代码
// tableView每次要显示一个cell都会调用这个方法获取
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//1.从重用池中取得一个cell, 如果重用池中没有cell, 系统会根据注册的cell类自动创建一个返回
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse"];
//2.给cell上的视图重新赋值
cell.textLabel.text = @"标题";
//3.返回cell
return cell;
}
五.UITableView和数组数据的结合使用
UITableView每一行显示的内容不可能都是一样的.
1.UITableView和数组
/*
@interface ViewController ( ) <UITableViewDataSource, UITableViewDelegate>
// 数组属性, 用来和tableView结合使用
@property (nonatomic, retain) NSMutableArray *sourceArr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化数组
self.sourceArr = [NSMutableArray arrayWithObjects:@"张三",@"李四",@"王五",@"赵六",nil];
}
2.UITableView结合数组的代码(1)
// tableView每个分区要显示的行数
- (NSInteger) tableView:(UITableVIew *)tableView numberOfRowsInSection:(NSInteger)section{
// 根据元素个数设置行数
return self.sourceArr.count;
}
// tableView每次要显示一个cell都会调用这个方法获取
-(UITableViewCell *)tableView:(UITableVIew *)tableView cellForRowAtIndexpath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse"];
// 根据row从数组中取值
cell.textLable.text = [self.sourceArr objectAtIndex:indexPath.row];
return cell;
}
六.UITableView的常用协议方法
1.UITableViewDataSource
2.UITableViewDelegate