在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信、QQ等软件上随处都是UITableView。
1,UITableView基本样式
(1):UITableViewStylePlain(普通表视图)
(2):UITableViewStyleGroup(分组表视图)
2,UITableView表视图的结构
(1):表头视图(table header view).表视图最上边的视图,用于展示表视图的信息
(2):表脚视图(table footer view).表视图最下边的视图,用于展示表视图的部分信息
(3):单元格(cell)。它是组成表视图每一行的单位视图
(4):节(selection)。它是多个单元格在组成,并且有节头和节脚
(5):节头。节的头部,描述节的信息
(6):节脚.节的尾部,描述节的信息或者一些声明信息
3,表视图的创建
ios表没有限制行数,行数仅受可用存储空间的限制,表只有一列。是UITableView类的一个实例。
(1)Controller.h需要实现两个 delegate ,分别是UITableViewDelegate 和 UITableViewDataSource
@interface ViewController : UIViewController
(2)UITableView对象的 delegate和dataSource要设置为 self,并添加至view。
tableView.delegate = self; tableView.dataSource = self; [self.view addSubview:tableView];
(3)然后就可以实现这些dataSource和delegate的一些方法。
4,dataSource和delegate
UITableView属于View,UIViewController属于Controller。
View所需要的数据,应该是Controller去跟Model协调然后获得,以后由Controller去给View来进行显示。View永远的不去直接跟Model联系。
这样当UITableView初始化的时候。他就会去问他的data source。我需要显示多少行数据啊。每一行的数据都是什么内容啊。这时候UIViewController应该已经从Model拿到了数据。
然后,通过- (NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section; 告诉UITableview,你的这一组要显示n条数据。 又用- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath函数 告诉UITableView说,第几组第几条数据的具体内容是什么。
5,UITableViewDataSource常用方法
(1),必须实现 设置每个分组的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
(2),必须实现, 设置每个分区的cell
- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath // 每行都是一个UITableViewCell实例
(3),设置分组个数 默认返回1 第一个被调用
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
(4),为每个分组设置标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
(5),为分组设置索引
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
(6),设置tableView每组的编辑状态
- (BOOL)tableView:(UITableView *)tableView canEditRowA tIndexPath:(NSIndexPath *)indexPath
(7),当提交编辑操作时触发(插入或删除)
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyleforRowAtIndexPath:(NSIndexPath *)indexPath
(8),设置tableView每一个cell是否允许移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
(9),提交移动操作之后触发
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
6,UITableViewDelegate常用方法
(1),设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
(2),设置cell选中的事件
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
(3),设置tableViewCell的编辑样式(插入,删除)
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath
(4),设置当点击删除按钮时提示的确认文字
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0)
(5),设置cell的移动位置
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath*)proposedDestinationIndexPath{ //现在移动时只能在本区内移动 //sourceIndexPath原地址 //proposedDestinationIndexPath将要移动到的地址 if(sourceIndexPath.section == proposedDestinationIndexPath.section) { //如果是同一个分区,返回目的地址 returnproposedDestinationIndexPath; } //如果不是同一个分区,返回原来的地址 returnsourceIndexPath; }
7,UITableViewCell
(1)UItableViewCell的四种风格常量:
UITableViewCellStyleDefault UITableViewCellStyleSubtitle UITableViewCellStyleValue1 UITableViewCellStyleValue2
(2)表视图中cell的实现:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Cell];
}
return cell;
}
(3)重用机制:UITableView的dequeueReusableCellWithIdentifier方法去一个队列里面需找有没有相同ID的的Cell。如果有,就提出来重用。如果没有就跳进if里面去创建。所以我们在if里面创建的时候,不会改变的内容都可以在里面创建,这样就只用创建一次。需要改变的内容我们就放到if后面去写。 这样我们就能完成高效的UITableView。当然,理论上来说,你可以不用这样的机制,而去直接每次创建一个Cell。不过这是非常浪费资源的一个做法,不提倡。
我们可以这样理解, dequeueReusableCellWithIdentifier方法 就是用来创建几个有限的cell。 其实,手机屏幕再大,可显示的行数也是有限的。 或许,一个TableView 的数据来源有可能是上千条数据,但我们不会为此创建上千个Cell,如果这样做,对内存将是一个极大的浪费。所以呢, 我们通过dequeueReusableCellWithIdentifier方法,重用已经创建的Cell, 只需要填充不同的数据即可。