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"

时间: 2024-12-26 21:31:04

iOS学习笔记之UITableViewController&UITableView的相关文章

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

iOS学习笔记(4) — UITableView的 重用机制 UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的个数.比如,cell高度为90.那么480 / 90 = 5 + 1,也就是说最多有6个cell能显示在屏幕中. 系统会创建1个cel池,无论tableview有多少行都只创建6个cell放在池中.当某行移出屏幕的时候,将这个cell放回在池中:当某行需要显示在屏幕中时,从池中取出一个cell. 重

iOS学习笔记—— UItableView 控件的简单使用

UITableView 可以说是iOS开发中最常用的控件,除了游戏之外,几乎所有的应用中独会出现他的身影. 使用UITableView控件需要遵守两种协议 UITableViewDelegate和 UITableViewDataSource. 常用方法如下: 1.返回(每个分区)表单元个数(行数) - (NSInteger) tableView: (UItableView *) tableVIew numberOfRowsInSection: (NSInteger)section 2.返回表单元

iOS学习笔记(2)— UIView用户事件响应

iOS学习笔记(2)— UIView用户事件响应 UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YE

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

一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种方式可以对地图进行精准的控制 调用苹果官方自带的地图应用,主要用于一些简单的地图应用,无法精确控制 使用第三方地图开发SDK库 用得最多的还是MapKit,所以这节就只讲MapKit的使用. 二.MapKit核心类 MapKit的核心类为地图展示控件MKMapView,以下是常用的属性.对象方法以及

iOS: 学习笔记, Swift操作符定义

Swift操作符可以自行定义, 只需要加上简单的标志符即可. @infix 中置运算. 如+,-,*,/运算 @prefix 前置运算. 如- @postfix 后置运算. a++, a-- @assignment 赋值运算. +=, -=, --a, ++a // // main.swift // SwiftBasic // // Created by yao_yu on 14-7-27. // Copyright (c) 2014年 yao_yu. All rights reserved.

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS: 学习笔记, 添加一个带界面约束的控制器

1. 创建一个空iOS应用程序(Empty Application). 2. 添加加控制器类. 修改控制器类的viewDidLoad 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 //创建标题 5 UILabel *header = [[UILabel alloc] init]; 6 header.text = @"欢迎来到我的世界!"; 7 header.textAlignment = NSTextAlignmentCenter

iOS学习笔记(3)— 屏幕旋转

iOS学习笔记(3)— 屏幕旋转 一.屏幕旋转机制: iOS通过加速计判断当前的设备方向和屏幕旋转.当加速计检测到方向变化的时候,屏幕旋转的流程如下: 1.设备旋转时,系统接收到旋转事件. 2.系统将旋转事件通过AppDelegate通知当前的主Window. 3.window通知它的rootViewController. 4.rootViewController判断所支持的旋转方向,完成旋转. iOS系统中屏幕旋转事件没有像触碰事件那样进行hitTest,所以只有rootViewControl

iOS学习笔记(1)— UIView 渲染和内容管理

iOS学习笔记(1)— UIView 渲染和内容管理 iOS中应用程序基本上都是基于MVC模式开发的.UIView就是模型-视图-控制器中的视图,在iOS终端上看到的.摸到的都是UIView. UIView在屏幕上定义了一个矩形区域和管理区域内容的接口.在运行时,一个视图对象控制该区域的渲染:UIView继承自UIResponder,UIResponder是用来响应事件的类,UIView也具有响应事件的能力.所以说UIView具有三个基本的功能,绘制内容并管理内容的布局,响应用户交互,动画.正是