1.概述

继承自UIScrollView,只能显示一列数据,只能纵向滑动。堪称UIKit里面最复杂的一个控件了,使用起来不算难,但是要用好并不容易。当使用的时候我们必须要考虑到后台数据的设计,tableViewCell的设计和重用以及tableView的效率等问题。

可以表现为Plain和Grouped两种风格。

提供了一系列方法对cell进行编辑(insert/delete/reload/move):- (void)setEditing:(BOOL)editing animated:(BOOL)animated;//开启表格编辑状态

UITableView有两个Delegate分别为:dataSource和delegate。

dataSource是UITableViewDataSource类型,主要为UITableView提供显示用的数据(UITableViewCell)。

    delegate是UITableViewDelegate类型,主要提供一些可选的方法,用来控制tableView的选择、指定section的头和尾的显示以及协助完成cell的删除和排序等功能。

2. UITableViewController

是系统提供的便利类,已经遵守了数据源和代理协议,并已设置自己为数据源与代理对象。默认情况下使用UITableViewController创建的tableView是充满全屏的,如果需要用到tableView是不充满全屏的话,我们应该使用UIViewController自己创建和维护tableView。initWithStyle初始化函数可以指定Plain或者Grouped类型,init默认为Plain。viewWillAppear的时候,会清空所有选中cell,我们可以通过设置self.clearsSelectionOnViewWillAppear = NO,来禁用该功能(界面跳转时很有用)

view == tableView

3. UITableViewCell

四种cell样式UITableViewCellStyleDefault、UITableViewCellStyleSubtitle、UITableViewCellStyleValue1、UITableViewCellStyleValue2。右边的箭头也有4种样式:

1. Default: 显示图片的imageView,一个标题textLabel,右边一个Disclosure Indicator(右箭头)。对应storyboard里面的Basic

2. Subtitle样式:显示图片的imageView,上边一个主标题textLabel,一个副标题detailTextLabel,一个Detail类型箭头。对应storyboard里面的Subtitle。

3. Value1:一个显示图片的imageView,左边一个主标题textLabel,右边一个副标题detailTextLabel,一个Detail Disclosure类型箭头。对应storyboard里面的Right Detail

4. Value2样式:左边一个主标题textLabel字体偏小,挨着右边一个副标题detailTextLabel,一个Checkmark箭头(少用)。对应storyboard里面的Left Detail

我们可以通过cell的selectionStyle属性指定cell选中时的显示风格,以及通过accessoryType来指定cell右边的显示的内容,或者直接指定accessoryView来自定义右边显示的view。 最后就是自定义cell。使用cell重用时一定要注意重用带来的问题。

4.如何提高tableView的性能

    a、b、c为官方推荐

    a、重用cell

我们都知道申请内存是需要时间,特别是在一段时间内频繁的申请内存将会造成很大的开销,而且上tebleView中cell大部分情况下布局都是一样的,这个时候我们可以通过回收重用机制来提高性能。

重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象

  另外,cell展示完放入对象池的时候,cell的内容也不会释放,特别是一些图片多媒体等等,占用的内存比较大,可以通过实现UITableView的代理方法

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

来释放cell不用的资源,在此方法里面将其持有的图片多媒体等等资源释放掉。还可以解决一些cell重用产生的问题。

b、避免content的重新布局

尽量避免在重用cell时候,对cell的重新布局,一般情况在在创建cell的时候就将cell布局好。

     c、使用不透明的subView

在定制cell的时候,将要添加的subView设置成不透明的会大大减少多个view层叠加时渲染所需要的时间。

    dtableViewdelegate的方法如非必要,尽量不要实现

tableView的delegate中的很多函数提供了对cell属性的进一步控制,比如每个cell的高度,cell是否可以编辑,支持的edit风格等,如非必要最好不要实现这些方法因为快速的调用这些方法也会影响性能。

    e、计算行高

尽量避免计算行高,或者统一设置。如果必须计算单个的行高,则先返回一个预估行高(estimatedHeightForRowAtIndexPath)。

另外,如果牵涉到网络加载,比如图片,一般采用异步的方法。

    f、tableView的刷新

  基本上有三种方式,尽量不使用第一种:

// 方式1:刷新整个table
- (void)reloadData; // 方式2:刷新指定的cells
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation; // 方式3:多个insert/delete批量事务处理,特别是有动画的时候
- (void)beginUpdates; // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable
- (void)endUpdates; // only call insert/delete/reload calls or change the editing state inside an update block. otherwise things like row count, etc. may be invalid.
  • 方式1会刷新整个table,一般情况下不建议使用
  • cell显示的数据需要发生变化时,通常采用方式2:只刷新指定的cell(s),对table中的其它cell不会产生影响。
  • insert/delete cell候,一般使用方式3特别是涉及到cell动画的时候,使用其他会出现莫名的现象

5.一些细节

  • tableview group类型section之间的空隙

tableview类型设为group,sectionHeader,sectionFooter会随着tableview一起滑动,如果是plain,sectionHeader和会悬浮。

另外group类型时,每个section之间会有空隙,但它一般并不是我们想要的。可以通过如下代码,去掉空隙(返回0,会使用系统默认空隙)

下面代码对sectionHeader做处理,如果有header则显示,并返回高度,如果没有则返回nil,且高度返回CGFLOAT_MIN(去掉section间的空隙):

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if (判断是否返回view) {
// 返回view
}
else {
// 返回nil
return nil;
}
} - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (如果有view) {
return view高度;
}
return CGFLOAT_MIN;
} - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}

避免数组越界:先reloadData,然后在停止控件刷新

  • 行高为CGFLOAT_MIN,cell显示错乱的问题

很多时候,不想展示一行cell,可以通过返回行高为CGFLOAT_MIN的方式。但是有时候明明返回行高已经是CGFLOAT_MIN,但是还是会显示cell,且错乱。具体表现:cell行高的确为CGFLOAT_MIN,但是它的子view却显示出来了。出现这种情况,应该是刷新cell时向cell中又添加了新的view。只在cell创建时新增子view,其它刷新情况不添加即可。

OC中UITabelView的更多相关文章

  1. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  2. java中的继承与oc中的继承的区别

    为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...

  3. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

  4. OC中类别、扩展、协议与委托

    一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...

  5. OC中的私有变量和description

    .OC中的私有变量 在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只 是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private ...

  6. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

  7. OC中面向对象2

    一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现 ...

  8. OC中的面向对象语法

    一. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 打开电脑 播放电 ...

  9. OC中的指针

    NSError *err = nil; NSError __strong **error = &err; //因为在oc中,通过* *err 创建的指针是用__strong修改的,所以要一致, ...

随机推荐

  1. 【Swift学习】Swift编程之旅---枚举(十二)

    枚举为一组相关的值定义一个共同的类型,并允许您在代码中的以类型安全的方式中使用这些值,在 Swift 中,枚举类型是一等(first-class)类型.它们采用了很多传统上只被类所支持的特征,例如计算 ...

  2. noip模拟赛 好元素 哈希表的第一题

    这是一道关于 题2好元素 2s [问题描述] 小A一直认为,如果在一个由N个整数组成的数列{An}中,存在以下情况: Am+An+Ap = Ai (1 <= m, n, p < i < ...

  3. ROS 常用命令字典

    版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5761448.html 该博文适合已经具备一定的ROS编程基础的人,快速查看ROS相关 ...

  4. ASP.NET MVC系列:控制器的Edit方法

    在前面我们已经介绍了如何创建控制器.视图和数据模型,运行之前的项目并打开Movies主页,将鼠标悬停在“编辑”菜单上,你会看到浏览器右下角显示了“编辑”链接的地址

  5. Visual Studio 技能GET

    常用快捷键 自动生成头部注释 代码片段 NuGet Team Foundation 常用的VS快捷键 查看与设置快捷键 一般在菜单里面我们直接就可以看到一些功能的快捷键.另外,可以依次通过 菜单栏-工 ...

  6. LINQ的Except方法

    在两个集合中,左边集合减去右边集合的元素: source code: List<int> a = new List<int>{ { }, { }, { } }; List< ...

  7. 局部(或全局)设置<a>标签的target属性

            对于超链接<a>标签,target属性的设置是比较关键的,在不同的用户场景下选用适合的新页面载入方式,可以大大的提高访客的体验感.我们一般对target的设置可以挨个来,但 ...

  8. ajax携带状态值

  9. spring笔记2 spring MVC的基础知识2

    2,spring MVC的注解驱动控制器,rest风格的支持 作为spring mvc的明星级别的功能,无疑是使得自己的code比较优雅的秘密武器: @RequestMapping处理用户的请求,下面 ...

  10. javamail 利用qq邮箱做邮箱服务器,简单小demo

    首先maven: <dependency> <groupId>javax.mail</groupId> <artifactId>mail</art ...