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. GO语言的进阶之路-流程控制

    GO语言的进阶之路-流程控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.流程控制 ...

  2. 拒绝了对对象 'Proc_LHDashBoard' (数据库 'jy',架构 'dbo')的 EXECUTE 权限。”

    没有权限,在数据库里面开启权限.找到你那个访问的用户名,然后:

  3. table中表头不动,表体产生滚动条

    <div id="elec_table"> 2 <div class="table-head"> 3 <table> 4 & ...

  4. 设置MyBatis在控制台打印SQL语句

    在调试阶段,打印SQL会极大方便开发者.MyBatis有提供配置,只需要在MyBatis的配置文件mybatis-config.xml中<configuration>节点下,添加如下配置: ...

  5. python 创建实例--待完善

    今天好好琢磨一下 python 创建实例的先后顺序 一. 就定义一个普通类 Util (默认)继承自 object,覆写 new ,init 方法 class Util(object): def __ ...

  6. 03-Windows Server 2016 IIS的安装与配置

    1. 打开服务器管理器,点击[添加角色和功能选项].        2. 进入“添加角色和功能向导”页面,点击下一步. 3. 安装类型选择[基于角色或基于功能的安装],点击下一步. 4. 进入服务器选 ...

  7. __weak 修饰符

    在 HAL 库中,很多回调函数前面使用__weak 修饰符,这里我们有必要给大家讲解__weak 修饰符的作用. weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一 ...

  8. ASP.NET MVC中的Session设置

    最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.N ...

  9. VMware workstation 网络选择 NAT模式 访问外网

    多年不用本地做测试  尽然被 nat 模式給卡着了  :动手的还是所以要记录一下: 1.根据自己需求创建 虚拟机 之后: 配置[网络适配器] -- 选择 nat 模式 ( 选择网卡 )   虚拟机   ...

  10. pytorch中如何使用DataLoader对数据集进行批处理

    最近搞了搞minist手写数据集的神经网络搭建,一个数据集里面很多个数据,不能一次喂入,所以需要分成一小块一小块喂入搭建好的网络. pytorch中有很方便的dataloader函数来方便我们进行批处 ...