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"