OC中UITabelView
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层叠加时渲染所需要的时间。
d、tableView的delegate的方法如非必要,尽量不要实现
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/deletecell候,一般使用方式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的更多相关文章
- OC中加载html5调用html方法和修改HTML5内容
1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...
- java中的继承与oc中的继承的区别
为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...
- Swift: 比较Swift中闭包传值、OC中的Block传值
一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
- OC中的私有变量和description
.OC中的私有变量 在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只 是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private ...
- Oc中的数组
========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...
- OC中面向对象2
一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现 ...
- OC中的面向对象语法
一. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 打开电脑 播放电 ...
- OC中的指针
NSError *err = nil; NSError __strong **error = &err; //因为在oc中,通过* *err 创建的指针是用__strong修改的,所以要一致, ...
随机推荐
- 【Swift学习】Swift编程之旅(四)基本运算符
Swift支持大部分标准C语言的运算符, 且改进许多特性来减少常规编码错误.如赋值符 = 不返回值, 以防止错把等号 == 写成赋值号 = 而导致Bug. 数值运算符( + , -, *, /, %等 ...
- SpringMVC——自定义拦截器、异常处理以及父子容器配置
自定义拦截器: 一.若想实现自定义拦截器,需要实现 org.springframework.web.servlet.HandlerInterceptor 接口. 二.HandlerIntercepto ...
- 找到多个与名为“Login”的控制器匹配的类型
添加了mvc区域以后,可能出现以下错误... 找到多个与名为“Login”的控制器匹配的类型.如果为此请求(“{controller}/{action}/{id}”)提供服务的路由在搜索匹配此请求的控 ...
- Win10 QQ五笔默认中文,InputMode默认中文
Win10系统安装了QQ五笔后,InputMode默认英文,必须用鼠标点或者按 Ctrl+空格才能转换为中文.非常不方便. 即使将微软拼音默认为中文也不管用,解决方法如下: 设置后,无论你打开运行.记 ...
- 百度云推送-服务端 C# SDK
思路: 1.公司有项目需要做android和ios手机端推送消息的功能: 2.没有接触过这方面的知识,一头雾水,开始在网上一顿搜,网上倒是有不少解决方案,首先搜的是android的解决方案,因为ios ...
- 使用DataConnectionDialog在运行时设置数据源连接字符串
介绍: DataConnectionDialog 类: 打开“数据连接”对话框,获取用户选择的数据连接信息. 命名空间为:Microsoft.Data.ConnectionUI 所在程序集:Micro ...
- jquery简单原则器(匹配第一个元素)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MySQL函数不能创建的解决方法
MySQL函数不能创建,是一个很麻烦的问题,下面就为您提供了一个解决此问题的方法,如果您也遇到过类似的问题,不妨一看. http://database.51cto.com/art/201010/229 ...
- 去除utf8文件的bom标记
http://stackoverflow.com/questions/1068650/using-awk-to-remove-the-byte-order-mark http://thegreyblo ...
- collection中的retainAll()方法
public class ArraylistDemo { public static void main(String[] args) { Collection list1 = new ArrayLi ...