在iOS开发中,UITableView是使用非常 广泛的控件,我们平时使用的很多软件中到处都可以看到它的影子,常见的像手机中的设置,生活中的QQ,微信等,都可以使用UITableView来实现。下面就简单的说明一下UITableView的一些特性和使用方式。
一:什么是UITableView
1.UITableView继承自UIScrollView,所以可以滚动(只支持垂直滚动)查看里面展示的内容。在iOS开发中,UITableView是展示大量内容的首选
2.一般来说进行大量的有规则排列的数据首先考虑使用UITableView
3.UITableView具有重用和延迟加载等特性,可以有效的提高效率(它并不会一次性的将所有数据进行加载,而只是加载当前视图中可见的数据)
4.UITableView的每一行数据就是一个UITableViewCell,UITableView只能有一列数据(cell),且只支持纵向滑动,当创建好的tablView第一次显示的时候,我们需要调用其reloadData方法,使tableView的数据更新到最新状态。
二:UITableView的几个重要属性
1.datasource:是UITableViewDataSource类型,主要为UITableView提供显示用的数据,指定UITableViewCell支持的编辑操作类型(insert,delete和reordering),并根据用户的操作进行相应的数据更新操作
2.delegate:是UITableViewDelegate类型,主要提供一些可选的方法,用来控制tableView的选择、指定section的头和尾的显示
3.rowHeight:设置每一行数据的高度
4.UITableView的style属性:
a)plain:不分组,所有数据都属于同一个组
b)grouped:分组,会显示有默认的头部块和底部块
c)这里说明 一下style属性的设置,如果是手动拖拽控件的方式添加UITableView,那么只能通过style属性进行设置,如果是代码创建UITableView,那么可以在创建的时候调用initWithFrame:<#(CGRect)#> style:<#(UITableViewStyle)#>来进行style的设置。
一般情况下我们会设置当前控制器为UITableView的datasource和delegate,理由:根据MVC设计模式,view是与controller进行交互的。而UITableView是View,UIViewController是Controller,所以展示数据的view需要数据就会调用controller的数据源方法获取数据,而不会去关注数据如何获取。简单的说,在UITableView中,在要展示数据的时候,就会询问它的数据源到底需要显示多少组数据,每一组数据中有几行数据,每一行数据具体的内容是什么,控制器就负责实现这些方法,而UITableView只负责显示。控制器负责获取数据,UITableView负责展示,这就是mvc的好处。
三:UITableView常用数据源方法
在展示大量数据的时候我们需要考虑:1.全部的数据一共可以分为多少组2.每一组有多少条数据3每一条数据的具体内容是什么。基于这三点我们需要掌握下面数据源方法
1.-(NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView:这个方法用来确定当前UITableView一共有几组数据,如果没有实现这个数据源方法,那么系统默认只有一组数据,也就意味着这个方法默认返回1.如果有多组数据,那么就需要在这个方法里面进行确定。
2.-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section:这个方法确定在对应的组中有几条(行)数据,必须在实现这个方法,否则数据无法显示。当每一次创建组的时候都会调用这个方法确定该组的数据行数量。
3.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;这个方法确定某个组中某一行显示的具体的内容,在UITableView中,真正的数据显示在cell中,所以为cell的某些属性赋值才能真正的让数据展示出来。在创建每一组每一行显示的数据的时候都会调用这个方法,这是必须实现的方法。
4.- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section:设置头部文本,返回默认样式的文本
5. - (NSString*)
tableView:(UITableView*)tableViewtitleForFooterInSection:(NSInteger)section:设置底部文本,返回默认样式的文本。
四:系统自定义cell的三个默认成员:
a)imageView:默认在最左边显示的小图像,可以不设置,如果没有则不显示图片
b)textLabel:显示的文本,一般情况下显示的文本都是使用这个属性
c)detailTextLabel:显示的详细介绍,一般字体大小比textLabel小,如果不设置则不显示。
d)图示:
五:UITableViewCell的样式(style):
这是一个只读属性,只有在创建的时候可以设置。
a)UITableViewCellStyleDefault:该格式提供了一个简单的左对齐的文本标签textLabel和一个可选的图像imageView。如果显示图像,那么图像将在最左边。这种格式虽然可以设置detailTextLabel,但是不会显示该标签。
b)UITableViewCellStyleSubtitle:该格式与前一种相比,增加了对detailTextLabel的支持,该标签将会显示在textLabel标签的下面,字体相对较小。
c)UITableViewCellStyleValue1:该格式居左显示textLabel,居右显示detailTextLabel,且字体较小
d)UITableViewCellStyleValue2:该格式居左现实一个小型蓝色主标签textLabel,在其右边显示一个小型黑色副标题详细标签detailTextLabel,该格式不支持图像
e)图例:
六:UITableViewCell的accessoryType属性
a)UITableViewCellAccessoryNone;//cell没有任何的样式
b)UITableViewCellAccessoryDisclosureIndicator;//cell的右边有一个小箭头,距离右边有十几像素
c)UITableViewCellAccessoryDetailDisclosureButton;//cell右边有一个蓝色的圆形button和一个>
d)UITableViewCellAccessoryDetailButton://cell右边有一个小圆圈,里面有倒立的叹号
e)UITableViewCellAccessoryCheckmark;//cell右边的形状是对号
七:cell的优化:
a)为什么需要优化:iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象
b)优化原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象,这就节省了创建新对象的时间,也避免了反复的内存分配及开销。
c)如何进行cell的重用:可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象,以便下一次重用。
八:重用案例示例:
//数据源方法:创建cell
- (UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
//定义重用标识
NSString*ID=@"hero";
//从缓存中创建cell,而不是直接创建一个新的cell,查找缓存,如果缓存中存在可被重用的cell,那么就不会再重新创建cell,避免了反复的创建和回收,节省资源
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:ID];
//缓存中有可能并不存在可被重用的cell(如第一次创建的时候),所以判断如果没有从缓存中获取可重用的cell,那么就创建一个新的cell
if(cell==nil)
{
//创建cell样式选择UITableViewCellStyleSubtitle的原因是还需要显示图片和详细说明信息reuseIdentifier是为当前创建的cell设置标识,方便下一次的重用
cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:ID];
}
//创建cell后为cell赋值
//获取模型数据
WHHero*hero=self.heros[indexPath.row];
//设置图像
cell.imageView.image=[UIImageimageNamed:hero.icon];
//设置文本
cell.textLabel.text=hero.name;
//设置详细说明信息文本
cell.detailTextLabel.text=hero.intro;
//返回创建好的cell
returncell;
}
UITableView还有一些常用的代理方法,用于数据的相关操作,之后的文章里会做出说明。