UITableView总结
2016-03-09 13:52
363 查看
UITableView是UIScrollView的子类,因此它可以自动响应滚动事件(一般为上下滚动)。
它内部包含0到多个UITableViewCell对象,每个table cell展示各自的内容。当新cell需要被显示时,就会调用tableView:cellForRowAtIndexPath:方法来获取或创建一个cell;而不可视时,它又会被释放。由此可见,同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell。
UITableViewDelegate中的协议还有很多,我只列出了比较常用的,想知道更多的可以查看官方头文件或官方文档
分割线:separator 复制粘贴:Copy/Paste 拖拽:move 索引:index 编辑:editing
官方提供(ios6以上系统):UIRefreshControl
UIRefreshControl使用方法非常简单:
UIRefreshControl * _refresh;
?
另外UITableViewController中已经自带了UIRefreshControl 为成员变量,只需要增加猝发时间就可以了
2.自加按钮:
?
3.视图滚到最后直接加载更多:
?
?
不用xib的话,可以直接添加代码
?
demo: https://github.com/Jonear/iosDemo/tree/master/TableViewFresh
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @" cellIdentifier ";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:windowReuseIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:windowReuseIdentifier];
}
return cell;
}
如果你没使用xib或者storyboard的话可以在直接new一个cell,跟普通写法一样
1. 新建cell文件,继承UITableViewCell
2. 如果你没使用xib或者storyboard的话可以在直接new一个cell,跟普通写法一样
?
3. 如果有xib
?
4.还有个未必好的办法(这个办法也用于在xib多个view中获取到想要的一个)
?
重用机制调用的就是dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的cell”,因而只要将它换为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),就可以不使用重用机制,因而问题就可以得到解决,虽然可能会浪费一些空间。
第一个方法如果使用下面插入多次可能会有问题:
?
方法2 通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同(@"CMainCell%d", indexPath.row)
方法3 删除重用cell的所有子视图
这个方法是通过删除重用的cell的所有子视图,从而得到一个没有特殊格式的cell。
方法4:为不重用的单元格单独生成单独的cell,而不是重用队列中的单元格。
简单讲就是注册完cell后,使用
?
一定会有返回cell,系统在默认没有cell可复用的时候自动new一个cell出来。
?
demo:http://code4app.com/ios/SWTableViewCell/5269d9376803fa5367000001
2.尽量使用重用机制,不要创建太多cell
3.尽量不要使用透明视图,和layer改造
4.重载共同部分可以放在生成Cell部分
5.尽量不要老调用reloaddata,可能的情况下可以考虑使用
?
它内部包含0到多个UITableViewCell对象,每个table cell展示各自的内容。当新cell需要被显示时,就会调用tableView:cellForRowAtIndexPath:方法来获取或创建一个cell;而不可视时,它又会被释放。由此可见,同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell。
1.协议介绍
UITableViewDataSource(11)
?UITableViewDelegate(常用)
?分割线:separator 复制粘贴:Copy/Paste 拖拽:move 索引:index 编辑:editing
2.刷新
下拉刷新:
第三方:EGORefreshTableHeaderView官方提供(ios6以上系统):UIRefreshControl
UIRefreshControl使用方法非常简单:
UIRefreshControl * _refresh;
?
上拉刷新
1.第三方:EGORefreshTableFooterView2.自加按钮:
?
?
3.搜索
在xib中拖入search Bar and Search Display控件,实现UISearchBarDelegate协议?
?
4.重用
UItableView对Cell有一套重用机制,他会将滚出屏幕外的cell放到一个队列中,滚入屏幕的会从这个队列中获取cell,如果没有再去创建。- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @" cellIdentifier ";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:windowReuseIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:windowReuseIdentifier];
}
return cell;
}
自定义cell
新建cell文件,继承UITableViewCell如果你没使用xib或者storyboard的话可以在直接new一个cell,跟普通写法一样
1. 新建cell文件,继承UITableViewCell
2. 如果你没使用xib或者storyboard的话可以在直接new一个cell,跟普通写法一样
?
?
?
不使用重用方法
方法1 将获得cell的方法从- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 换为-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath重用机制调用的就是dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的cell”,因而只要将它换为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),就可以不使用重用机制,因而问题就可以得到解决,虽然可能会浪费一些空间。
第一个方法如果使用下面插入多次可能会有问题:
?
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同(@"CMainCell%d", indexPath.row)
方法3 删除重用cell的所有子视图
这个方法是通过删除重用的cell的所有子视图,从而得到一个没有特殊格式的cell。
方法4:为不重用的单元格单独生成单独的cell,而不是重用队列中的单元格。
注册Cell
??
5.编辑
?滑动更多
继承UITableViewCell,重新初始化方法?
6.优化
1.最好改造原生的tableViewCell,尽量不要用xib自定制cell,可以尽量在drawRect中绘制2.尽量使用重用机制,不要创建太多cell
3.尽量不要使用透明视图,和layer改造
4.重载共同部分可以放在生成Cell部分
5.尽量不要老调用reloaddata,可能的情况下可以考虑使用
?
相关文章推荐
- UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout
- EffectiveAndroidUI/UI框架
- PAT-Be Unique (20)
- 如何有效去掉分割线(UITableViewCellSeparatorView),并或控制单条分割线
- 智能指针(三):unique_ptr使用简介
- Confluence配置数据库
- BlueMix - IBM 的最新的云产品
- finished with non-zero exit value 2
- Error 'Can't drop database 'just'; database doesn't exist' on query.
- The error occurred while setting parameters 错误解析--Bad value for type timestamp : 3
- HDU 1560 DNA sequence DFS
- 139.Which three statements are true about multiple-row subqueries? (Choose three.)
- 138.Which statement is true regarding subqueries?
- UILabel自适应高度代码
- An internal error occurred during: "Building workspace". Java heap space
- iOS9: UIStackView入门
- UIview subview等等的view相关
- UIImage转换为NSData再转换为NSString实现post发送数据
- requirejs学习笔记
- Queue