UITableView使用笔记

UITableViewDataSource协议

@property (nonatomic, assign) id <UITableViewDataSource> dataSource;

// 一共有多少组数据

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

// 每一组有多少行数据

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// 每一行显示什么内容

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象

重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象

还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell

解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.定义一个cell的标识
      static NSString *flag = @"onlyFlag";

    // 2.从缓存池中取出cell
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:flag];

    // 3.如果缓存池中没有cell
      if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:flag];
    }

    // 4.设置cell的属性...

      return cell;
}
时间: 2024-10-12 11:58:48

UITableView使用笔记的相关文章

UITableView随笔笔记

UITableView 继承自UIScrollView,所以可以滚动,但只能是纵方向上的. UITableView由section和cell组成,填充的内容来自数据源,一般数据源由ViewController作为代理,因此需要遵循它的两个协议,分别是UITableViewDataSource 和 UITableViewDelegate. UITableView的简单实现步骤: 1. 设置UITableView在视图中,可以表现为Plain和Grouped两种风格: 2. 将UITableView

UITableView学习笔记

要让 UITableViewController 实现 UITableViewDataSource 协议,需要实现以下方法: 1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 指定section数 所谓的section,我目前的理解,就是类似通讯录里面的按照首字母分块A.B.C 2. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsIn

iOS UITableView学习笔记

下面分9个方面进行介绍: 一.UITableView概述 UITableView继承自UIScrollView,可以表现为Plain和Grouped两种风格,分别如下图所示:          其中左边的是Plain风格的,右边的是Grouped风格,这个区别还是很明显的. 查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和delegate. dataSource是UITableViewDataSource类型,主要为UIT

关于UITableview刷新笔记

今天在做项目的时候 发现调用tableview 的 reloaddata 方法的时候出现崩溃. - 具体操作是执行某个方法后将数据数组中的某条数据删除(数组中存数组)发现调用刷新方法后 程序崩溃,查看日志发现是数组越界 调试发现 numofsections 这个方法要慢于 cellforrow... 导致的,查阅相关资料因为tableview的代理方法和数据源调用有一个时间差,导致顺序问题 解决方法;在主线程中执行刷新 [self performSelectorOnMainThread:@sel

UITableView优化笔记(一)

推荐:http://code4app.com/ios/VVeboTableView/565d75a3594b90bf268b49ff 1: heightForRowAtIndexPath方法小做文章 原因:tableview继承自scrollview,当tableview加载时需要将contentSize计算出来.所以第一次加载时会频繁调用此方法,如:table有100行,则此方法调用100次,将每次得出的结果相加得到contentSize.就像每次使用scrollview滚动时都要设置cont

UITableView(转自一片枫叶)

UITableView学习笔记        作者:一片枫叶 看TableView的资料其实已经蛮久了,一直想写点儿东西,却总是因为各种原因拖延,今天晚上有时间静下心来记录一些最近学习的TableView的知识.下面进入正题,UITableView堪称UIKit里面最复杂的一个控件了,使用起来不算难,但是要用好并不容易.当使用的时候我们必须要考虑到后台数据的设计,tableViewCell的设计和重用以及tableView的效率等问题. 下面分9个方面进行介绍: 一.UITableView概述

他山之石 - 优秀博客

UITabBarController详解http://www.cnblogs.com/smileEvday/archive/2012/05/20/UITabBarController.html UINavigationController详解http://www.cnblogs.com/smileEvday/archive/2012/05/10/2495153.html UITableView学习笔记http://www.cnblogs.com/smileEvday/archive/2012/0

iOS学习笔记之UITableViewController&amp;UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M

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. 重