iOS学习笔记之UITableViewController&UITableView
iOS学习笔记之UITableViewController&UITableView
写在前面
上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法。这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候。也许网格序列水印这个课题本身的研究意义就是有待考证的。尽管如此,还是要努力的思考下去。由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了。
MVC简介
在介绍UITableView之前,简单的介绍一下MVC(Model-View-Controller)模式,它是iOS开发所遵循的一种设计模式。其含义是,应用创建的任何一个对象,其类型必定是以下三种类型中的一种
模型:负责存储数据,与用户界面无关
视图:负责显示界面,与模型对象无关
控制器:负责确保视图对象和模型对象的数据保持一致
UITableView简介
UITableView是视图,因此UITableView不负责处理应用的逻辑或数据,在实际使用UITableView时,要考虑下列问题:
通常情况下,要通过某个视图控制对象来创建和释放UITableView对象,并负责显示或隐藏视图
UITableView对象要有数据源才能正常工作。UITableView对象会向数据源查询要显示的函数、显示表格行所需的数据和其他所需数据。凡是遵守UITableViewDataSource协议的OC对象,都可以称为UITableView对象的数据源。
通常情况下,要为UITableView对象设置委托对象,以便能在该对象发生特定事件时做出相应的处理。凡是遵守UITableViewDelegate协议的对象,都可以称为UITableView对象的委托对象。
UITableViewController简介
UITableViewController对象可以扮演上述UITableView所需要的全部角色,包括视图控制对象、数据源和委托对象。
UITableViewController是UIViewController的子类,因此有自己的view属性。UITableViewController对象的view属性指向一个UITableView对象,并且这个UITableView对象由UITableViewController对象负责设置和显示。UITableVIewController对象会在创建UITableView对象后,为这个UITableView对象的dataSource和delegate赋值,并指向自己,如下图所示:
![enter description here][1]
UITableView数据源
UITableView对象会自己查询另一个对象以获得要显示的内容,这个对象就是UITableVIew对象的数据源,也就是dataSource属性所指向的对象。
当某个UITableView对象要获取显示的数据时,会向其数据源发送一组特定的消息,这些消息都是在UITableViewDataSource协议中声明的。tableView:numberOfRowsInSecton:和tableView:cellForRowAtIndexPath:是协议中必须实现的两个方法。UITableView对象可以通过数据源对象的这两个方法获得应该显示的行数及显示各行所需的视图。
tableView:numberOfRowsInSection:
方法原型
-(NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSIngeger)section
该方法是UITableViewDataSource中的必须方法,该方法会返回一个整型值(NSInteger),代表UITableView对象显示的函数。
UITableView对象可以分段显示数据,每个表格段(section)包含一组独立的行。传入tableView:numberOfRowsInSecton:方法中的section就是用于指定某个表格段。
- tableView:cellForRowAtIndexPath:
方法原型:
-(UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
在介绍该方法前,需要先介绍另一个类:UITableViewCell
UITableViewCell简介
表视图显示的每一行都是一个独立的视图,这些视图是UITableViewCell对象。UITableViewCell对象有一个子视图:contentView。contentView也包含很多子视图,它的子视图构成UITableViewCell对象的主要外观。负责显示UITableViewCell对象所代表的数据,是contentView所包含的三个子视图。其中两个视图是UILabel对象,分别为textLable属性和detailTextLabel属性所指向的对象。第三个是UIImageView对象,即imageView属性所指向的对象。
在创建UITableViewCell对象时,需要设置一种风格(UITableViewCellStyle),风格决定UITableViewCell对象会显示上述子视图中的哪几个,以及这些视图在contentView中的位置。下图列出了所有的风格常量和外观示例。
![enter description here][2]
下面假定我们在表格中要显示一些列的A对象。我们需要通过UITableViewCell对象的textLabel属性显示某个对象A的描述信息。这时需要实现UITableViewDataSource协议的第二个必须方法——tableView:cellForRowAtIndexPath:
在tableView:cellForRowAtIndexPath:需要完成的任务如下:创建一个UITableViewCell对象,获取UITableViewCell对象所代表的A对象,向A对象发送description消息,将得到的描述信息赋给UITableViewCell对象的textLabel属性,最后返回UITableViewCell对象。
传入tableView:cellForRowAtIndexPath:的第二个参数是一个NSIndexPath对象,该对象包含两个属性section(段)和row(行)。当UITableView对象向其数据源发送tableView:cellForRowAtIndexPath:消息时,其目的是获取用于显示第section个表格段、第row行数据的UITableViewCell对象。
重用UITableViewCell对象
iOS设备内存有限,因此若某个UITableView对象要显示大量的记录,并且要针对每条记录创建相应的UITableViewCell对象,就会很快耗尽iOS设备的内存。
为了解决该问题,需要重用UITabelViewCell对象。当用户滚动UITbelView对象时,部分UITableViewCell对象会移出窗口。UITableView对象会将移出窗口的UITableViewCell对象放入UITableViewCell对象池,等待重用。当UITableView对象要求数据源返回某个UITableVIewCell对象时,数据源可以先查看对象池。如果有未使用的UITabelViewCell对象,就可以用新的数据配置这个UITableViewCell对象,然后将其返回给UITableView对象,从而避免创建新对象。
总结
在使用UITableView时,要牢记UITableView是视图,只负责显示,而不进行数据和逻辑处理。如果要让UITableView分多个表格段显示,或进行其他复杂的显示,应该将判断逻辑放在“模型”部分,然后通过“控制器”将判断后的结果传入到UITableView中。
[1]: ./images/1464090777571.jpg "1464090777571.jpg"
[2]: ./images/1464093634179.jpg "1464093634179.jpg"
iOS学习笔记之UITableViewController&UITableView的更多相关文章
- iOS学习笔记(4) — UITableView的 重用机制
iOS学习笔记(4) — UITableView的 重用机制 UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的 ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习笔记-自己动手写RESideMenu
代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...
- iOS学习笔记20-地图(二)MapKit框架
一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- IOS学习笔记之关键词@dynamic
IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
随机推荐
- P4147 玉蟾宫
P4147 玉蟾宫 给定一个 \(N * M\) 的矩阵 求最大的全为 \(F\) 的子矩阵 Solution 悬线法 限制条件为转移来的和现在的都为 \(F\) Code #include<i ...
- 通过Cloudera Manager部署CDH5.15.1的webUI界面详解
通过Cloudera Manager部署CDH5.15.1的webUI界面详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客CDH的部署完全通过Cloudera Mana ...
- Elasticsearch日志分析系统
Elasticsearch日志分析系统 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是Elasticsearch 一个采用Restful API标准的高扩展性的和高可用性 ...
- 面向对象【day07】:类的属性(五)
本节内容 概述 公有属性 一.概述 前面我们讲了类的私有属性,现在我们来说说类的公有属性,这边很容易被人弄混淆,有人觉的,在__init__()构造方法中,除了私有属性,其他的都是公有属性了,其实这是 ...
- JVM总结(六):晚期(运行期)优化
这节我们总结一下JVM运行期的优化问题. JVM运行期优化 即时编译器(JIT) 编译对象与触发条件 编译对象 触发条件 编译过程 编译优化技术 JVM运行期优化 Java程序在运行的期间,可能会有某 ...
- .NET MVC中的防CSRF攻击
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- 基于vue-cli的改造的多页面开发脚手架
项目的GitHub地址:https://github.com/hellobajie/vue-cli-multipage 该脚手架同时支持vux,scss,less 目录结构 vue-cli-multi ...
- AtCoder Regular Contest 077 E - guruguru
https://arc077.contest.atcoder.jp/tasks/arc077_c 有m个点围成一个圈,按顺时针编号为1到m,一开始可以固定一个位置x,每次操作可以往顺时针方向走一步或直 ...
- 在O(N)时间内求解 正数数组中 两个数相加的 最大值
一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标.由加法运算的可逆性,j >i 这个条件可以去掉. 即求出: max ...
- Bleve代码阅读(二)——Index Mapping
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...