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. 一次性无重复配置VS项目插件属性的方法

    在VS中需要使用opencv开源库或mysql等数据库时,为了能使用开源库或数据库的语言,需要添加库文件和包含目录等等.然而直接在[解决方案管理器]-->属性中配置的话,写下一个项目(解决方案) ...

  2. 第81天:jQuery 插件使用方法

    在追求页面互动效果的时代,大家都想把页面效果做的美轮美奂,这一切都离不开前端技术脚本Javascript,而最近常被人用到的Javascript库文件则是jQuery.  jQuery的使用具体步骤如 ...

  3. HDU4059_The Boss on Mars

    数论题. 首先我们知道公式:1^4+2^4+3^4+……+n^4=(n)*(n+1)*(2*n+1)*(3*n*n+3*n-1) /30; 然后我们要把多余的减掉.这里用到的是mobius反演. 总之 ...

  4. HDU4701_Game

    很有意思,很好的一个题目. 题目的意思是两个人初始状态分别有A和B元,现在有N件可买的商品.两人轮流买,商品必须从左到右买过去,一次可以买若干个.第一个无法买到商品的人输. 一看就知道是博弈题目,但是 ...

  5. 【JavaScript】JAVA-input如何占满整个td

    如果使用下面这种方式,不会出现占满效果 <tr> <td colspan="2"> <input width="90%" alig ...

  6. C++解析(12):初始化列表与对象构造顺序、析构顺序

    0.目录 1.类成员的初始化 2.类中的const成员 3.对象的构造顺序 3.1 局部对象的构造顺序 3.2 堆对象的构造顺序 3.3 全局对象的构造顺序 4.对象的析构顺序 5.小结 1.类成员的 ...

  7. 【CF954I】Yet Another String Matching Problem(FFT)

    [CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...

  8. 【HDU5919】SequenceII(主席树)

    [HDU5919]SequenceII(主席树) 题面 Vjudge 翻译(by ppl) 给一个长度为N的数列A,有m个询问,每次问 数列[l,r]区间中所有数的第一次出现的位置的中位 数是多少 题 ...

  9. 硬盘杀手!Windows版Redis疯狂占用C盘空间【转】

    [问题的原因] Windows版Redis启动后,会在C盘自动创建一个很大的文件,C:\Users\{你的用户名}\AppData\Local\Redis\RedisQFolk_****.dat 我们 ...

  10. 【bzoj4182】shopping

    Portal --> bzoj4182 Solution 感天动地..几百年没在场上写点分了的感觉== (然后就写了很久qwq) ​ 不过感觉自己想这道题怎么颇有运气成分==大概是:诶是不是快乐 ...