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的更多相关文章

  1. iOS学习笔记(4) — UITableView的 重用机制

    iOS学习笔记(4) — UITableView的 重用机制 UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的 ...

  2. [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading

    上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...

  3. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  4. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  5. iOS学习笔记20-地图(二)MapKit框架

    一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...

  6. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  7. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  8. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  9. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

随机推荐

  1. 网络编程基础【day09】:socket编程入门(一)

    本节内容 1.OSI七层模型 2.概述 3.关系图 4.代码逻辑图 5.socket概念 一.OSI七层模型 二.概述 socket通常也称作"套接字",用于描述IP地址和端口,是 ...

  2. Python基础【day03】:字典(一)

    本节内容 简述 语法 字典的使用 字典内置方法 一.简述 字典是Python中的又一种数据结构,它是通过key-value的数据类型,跟我们小时候用的新华字典差不多,通过key去访问value 二.语 ...

  3. 原生ajax中get和post请求

    后台代码: class AjaxHanlder(tornado.web.RequestHandler): def get(self): print(self.get_argument('type',N ...

  4. JavaWeb应用和Servlet

    JavaWeb应用的生命周期是由Servlet容器来控制的.包括三个阶段: 1.启动阶段:加载Web应用的有关数据,创建ServletContest对象,对Filter(过滤器)和一些Servlet进 ...

  5. string和list互转

    import string str = 'abcde' list = list(str) OR list = str.split() list ['a', 'b', 'c', 'd', 'e'] st ...

  6. HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接

    一,持久连接 什么是持久连接?对于HTTP协议而言,它是基于请求响应模型,Client向Server发请求时,先建立一条HTTP连接,Server给Client响应数据后,连接关闭. 当Client发 ...

  7. [iOS]App上架流程[利用Archive进行上传]

    今天给大家带来项目如何上架的教程 准备: 1. 一个开发者账号(需要交过钱的,

  8. Mongodb 备份 数据导出导入

    MongoDB 客户端工具 mongochef 可以进行一系类操作 MongoDB 非客户端操作 : mongod 备份导出 mongoexport -h IP --port 端口 -u 用户名 -p ...

  9. CF875F Royal Questions

    传送门 似乎可以按边权排序后二分图匹配 这里给一个复杂度稳定的算法 把一个公主能匹配的两个点连边,然后依次加边,每当加到一个大小为\(n\)的连通块中有\(n\)条边之后,这时形成了基环树,将这些边定 ...

  10. 第15月第6天 ios UIScrollView不能响应TouchesBegin

    1. 1:@property MyScrollView *scrollView; 2:给MyScrollView,增加类别:MyScrollView+Touch 3:在类别里实现下面三个方法: @im ...