http://my.oschina.net/iq19900204/blog/292125
摘要 UITableView
目录[-]
- 1.协议介绍
- UITableViewDataSource(11)
- UITableViewDelegate(常用)
- 2.刷新
- 下拉刷新:
- 上拉刷新
- 3.搜索
- 4.重用
- 自定义cell
- 不使用重用方法
- 注册Cell
- 5.编辑
- 滑动更多
- 6.优化
UITableView 总结
UITableView是UIScrollView的子类,因此它可以自动响应滚动事件(一般为上下滚动)。
它内部包含0到多个UITableViewCell对象,每个table cell展示各自的内容。当新cell需要被显示时,就会调用tableView:cellForRowAtIndexPath:方法来获取或创建一个cell;而不可视时,它又会被释放。由此可见,同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell。
1.协议介绍
UITableViewDataSource(11)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
UITableViewDelegate(常用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
UITableViewDelegate中的协议还有很多,我只列出了比较常用的,想知道更多的可以查看官方头文件或官方文档
分割线:separator 复制粘贴:Copy/Paste 拖拽:move 索引:index 编辑:editing
2.刷新
下拉刷新:
第三方:EGORefreshTableHeaderView
官方提供(ios6以上系统):UIRefreshControl
UIRefreshControl使用方法非常简单:
UIRefreshControl * _refresh;
1 2 3 4 5 6 |
|
另外UITableViewController中已经自带了UIRefreshControl 为成员变量,只需要增加猝发时间就可以了
上拉刷新
1.第三方:EGORefreshTableFooterView
2.自加按钮:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
3.视图滚到最后直接加载更多:
1 2 3 4 5 6 7 8 |
|
3.搜索
在xib中拖入search Bar and Search Display控件,实现UISearchBarDelegate协议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
demo: https://github.com/Jonear/iosDemo/tree/master/TableViewFresh
4.重用
UItableView对Cell有一套重用机制,他会将滚出屏幕外的cell放到一个队列中,滚入屏幕的会从这个队列中获取cell,如果没有再去创建。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @" cellIdentifier ";
UITableViewCell * cell = [tableViewdequeueReusableCellWithIdentifier:windowReuseIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:windowReuseIdentifier];
}
return cell;
}
自定义cell
新建cell文件,继承UITableViewCell
如果你没使用xib或者storyboard的话可以在直接new一个cell,跟普通写法一样
1. 新建cell文件,继承UITableViewCell
2. 如果你没使用xib或者storyboard的话可以在直接new一个cell,跟普通写法一样
1 2 3 4 5 6 |
|
3. 如果有xib
1 2 3 4 5 6 |
|
4.还有个未必好的办法(这个办法也用于在xib多个view中获取到想要的一个)
1 2 3 4 5 6 7 8 9 10 11 |
|
不使用重用方法
方法1 将获得cell的方法从- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 换为-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
重用机制调用的就是dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的cell”,因而只要将它换为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),就可以不使用重用机制,因而问题就可以得到解决,虽然可能会浪费一些空间。
第一个方法如果使用下面插入多次可能会有问题:
1 2 |
|
方法2 通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同(@"CMainCell%d", indexPath.row)
方法3 删除重用cell的所有子视图
这个方法是通过删除重用的cell的所有子视图,从而得到一个没有特殊格式的cell。
方法4:为不重用的单元格单独生成单独的cell,而不是重用队列中的单元格。
注册Cell
1 2 3 4 5 6 7 8 |
|
简单讲就是注册完cell后,使用
1 |
|
一定会有返回cell,系统在默认没有cell可复用的时候自动new一个cell出来。
5.编辑
1 2 3 4 5 6 7 8 9 10 11 |
|
滑动更多
继承UITableViewCell,重新初始化方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
demo:http://code4app.com/ios/SWTableViewCell/5269d9376803fa5367000001
6.优化
1.最好改造原生的tableViewCell,尽量不要用xib自定制cell,可以尽量在drawRect中绘制
2.尽量使用重用机制,不要创建太多cell
3.尽量不要使用透明视图,和layer改造
4.重载共同部分可以放在生成Cell部分
5.尽量不要老调用reloaddata,可能的情况下可以考虑使用
1 2 3 4 5 6 7 8 9 |
|