在众多移动应?用中,能看到各式各样的表格数据 ,
• 在iOS中,要实现表格数据展?示,最常?用的做法就是使?用UITableView
• UITableView继承?自UIScrollView,因此?支持垂直滚动,?而且性能极佳
UITableView的两种样式,一种是只有一组别,还有一种是有多个数别如下图:
如何展?示数据 ?
UITableView需要?一个数据源(dataSource)来显?示数据,
UITableView会向数据源查询?一共有多少?行数据以及每?一?行显?示什么数据等
凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源
tableView展?示数据的过程
1. 调?用数据源的下?面?方法得知?一共有多少组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView;
2. 调?用数据源的下?面?方法得知每?一组有多少?行数据
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section;
3. 调?用数据源的下?面?方法得知每?一?行显?示什么内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
当然,我们还要实现协议,不然,这些代理方法也无法使用。
property (nonatomic, assign) id <UITableViewDataSource> dataSource; UITableView
通过这3个代理方法,就可以把想要显示在页面的数据,绑定到UITableView上。
二 Cell简介
- UITableView的每?一?行都是?一个UITableViewCell,通过dataSource的 tableView:cellForRowAtIndexPath:方法来初始化一?行
- UITableViewCell内部有个默认的?子视图:contentView,contentView是UITableViewCell所 显?示内容的?父视图,可显?示?一些辅助指?示视图•
- 辅助指?示视图的作?用是显?示?一个表?示动作的图标,可以通过设置UITableViewCell的 accessoryType来显?示,
- 默认是UITableViewCellAccessoryNone(不显?示辅助指?示视图), 其他值如下:
● UITableViewCellAccessoryDisclosureIndicator
● UITableViewCellAccessoryDetailDisclosureButton
● UITableViewCellAccessoryCheckmark
• 还可以通过cell的accessoryView属性来?自定义辅助指?示视图
UITableViewCell的contentView
• contentView下默认有3个?子视图
其中2个是UILabel(通过UITableViewCell的textLabel和detailTextLabel属性访问)
第3个是UIImageView(通过UITableViewCell的imageView属性访问)
UITableViewCell还有?一个UITableViewCellStyle属性,?用于决定使?用contentView的 哪些?子视图,以及这些?子视图在contentView中的位置
Cell的重?用原理
• iOS设备的内存有限,如果?用UITableView显?示成千上万条数据,就需要成千上万 个UITableViewCell对象的话,那将会耗尽iOS设备的内存。
要解决该问题,需要重 ?用UITableViewCell对象
• 重?用原理:当滚动列表时,部分UITableViewCell会移出窗??口,UITableView会将窗??口外 的UITableViewCell放?入?一个对象池中,等待重?用。
当UITableView要求dataSource返回 UITableViewCell时,dataSource会先查看这个对象池,
如果池中有未使?用的 UITableViewCell,dataSource会?用新的数据配置这个UITableViewCell,
然后返回给 UITableView,重新显?示到窗??口中,从?而避免创建新对象
• 还有?一个?非常重要的问题:有时候需要?自定义UITableViewCell(?用?一个?子类继 承UITableViewCell),
?而且每?一?行?用的不?一定是同?一种UITableViewCell,所以?一 个UITableView可能拥有不同类型的UITableViewCell,
对象池中也会有很多不同类型的 UITableViewCell,那么UITableView在重?用UITableViewCell时可能会得到错误类型的 UITableViewCell
• 解决?方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始
化UITableViewCell的时候传?入?一个特定的字符串标识来设置reuseIdentifier(?一般 ?用UITableViewCell的类名)。
当UITableView要求dataSource返回UITableViewCell时,先 通过?一个字符串标识到对象池中查找对应类型的UITableViewCell对象,
如果有,就重 ?用,如果没有,就传?入这个字符串标识来初始化?一个UITableViewCell对象
Cell的重?用代码 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath { ?// 1.定义?一个cell的标识 static NSString *ID = @"mjcell"; // 2.从缓存池中取出cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 3.如果缓存池中没有cell if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } // 4.设置cell的属性... return cell; }