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,其它刷新情况不添加即可。

iOS中UITabelView的更多相关文章

  1. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  2. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  3. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  4. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  5. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  6. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  7. 谈谈iOS中的屏幕方向

    众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...

  8. iOS中assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义  转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...

  9. Quartz 2D在ios中的使用简述二:创建画布

    在iOS中使用Quartz画图时,第一步就是要获取画布(图形上下文),然后再画布上做各种操作.先看下CoreGraphics.h这个头文件,就可以知道能够创建多少种上下文类型. #include &l ...

随机推荐

  1. Problem D - Non-boring sequences——Contest1004 - National Day Training Contest -- Day3

    今天比赛的时候做的一个坑题.深坑啊. 题目意思是给你一个有n个数的数字序列.要你判断对于这个序列是都满足任意一个子序列都至少含有一个只出现一次的数字. 看完题目后没什么思路,一直以为要用线段树,每次删 ...

  2. [HEOI2014]人人尽说江南好 博弈论

    题面 题面 题解 感觉这题挺神仙的,根据一些奇奇怪怪的证明可以得到: 最后的终止状态一定是\(m, m, m, m, .... n \% m\). 因此我们可以O(1)计算到终止状态所需步数,然后根据 ...

  3. 9个基于Java的搜索引擎

    1.Java 全文搜索引擎框架 Lucene 毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.Luc ...

  4. BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】

    题目链接 BZOJ2216 题解 学过高中数学都应知道,我们要求\(p\)的极值,参变分离为 \[h_j + sqrt{|i - j|} - h_i \le p\] 实际上就是求\(h_j + sqr ...

  5. BZOJ1264 [AHOI2006]基因匹配Match 【LCS转LIS】

    题目链接 BZOJ1264 题解 平凡的\(LCS\)是\(O(n^2)\)的 显然我们要根据题目的性质用一些不平凡的\(LCS\)求法 这就很巧妙了,, 我们考虑\(A\)序列的每个位置可能匹配\( ...

  6. 洛谷 P3338 [ZJOI2014]力 解题报告

    P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j ...

  7. linux内核设计与实现第七周读书笔记

    第七章 链接 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行.链接可以执行于编译时(compile time),也就是在源代 ...

  8. flex的使用实例

    之前的随笔从阮一峰老师那里学到了flex的基本用法及作用,现在来把flex具体运用到实例中,看看flex的弹性布局效果. 1.  flex设置元素垂直居中对齐 在之前的一篇文章中记载过如何垂直居中对齐 ...

  9. pycrypto 安装

    https://www.dlitz.net/software/pycrypto/ 下载pycrypto-2.6.1.tar.gz,解压后 python setup.py build python se ...

  10. maven 启动 tomcat 及 跳过 test 安装

    1.先在pom文件中配置 tomcat插件 <!-- 文件上传组件 --> <dependency> <groupId>commons-fileupload< ...