使用可重用 cell 的两种方式

1. 最常用的方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if ( !cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }  

    return cell;
}

2. 注册使用

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 

    return cell;
}

使用这种方法需要在创建 tableView 的时候注册

//下面这句代码的作用就是告诉 tableView ,它上面的 cell 都是根据 UITableViewCell 类型创建的
//如果重用的 cell 找不到,系统会自己根据这个类型创建一个 cell ,不需要编程人员创建;
[tableView registerClass:[UITableViewCell class]  forCellReuseIdentifier:@"cell"];

如果不先注册,程序在运行时会 crash

unable to dequeue a cell with identifier cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

不能出队一个标识为cell 的单元格,必须为这个标识符注册一个 nib 或者一个类或者连接一个在 storyboard 里的原型单元格

在我看来使用第一种方式更为灵活方便

1)第二种方法是在 iOS 6 及以后才开始支持的,对于早期的版本并不支持,应用到真机上,兼容性就是一大问题;

2)第二种方法虽然代码更加精简了,但是如果需要使用自定义的 cell,即只改变 cell 上的 textLabel 已经不能满足要求的时候,开发者需要根据自己的需要来添加不同的 view ,这时候,因为不能够定位到哪些 cell 是重用的,哪些不是,添加获得一个 cell 都需要添加 view ,这样,当滑动手机屏幕的时候,在那些重用的 cell 上就再次添加了一个相同的 view,随着滑动次数的增多,一个 cell 上叠加的 view 也越多,造成大量的内存消耗,这与 cell 重用的思想背道而驰;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
    imageView.frame = CGRectMake(15, 2, 40, 40);
    [cell addSubview:imageView];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(65, 2, 100, 20)];
    label.text = @"Hello";
    [cell addSubview:label];
    UILabel *subLabel = [[UILabel alloc] initWithFrame:CGRectMake(65, 22, 100, 20)];
    subLabel.text = @"你好";
    [cell addSubview:subLabel];

    return cell;
} //运行上面的代码,并不断滑动屏幕,会发现 cell 上的字体会变粗变黑,这个就是因为叠加了很多的 label 的原因;图片也叠加了很多,知识效果上看不明显,在去观察内存,会发现内存占用会越来越大

3)第二种方法使用之前必须先有 tableView 注册才能使用,否则程序崩溃,但在开发过程中很容易忘记, 而且使用这种方法不能设定 cell 的显示样式

使用第一种方法的时候,如果是想向  cell 上添加 view , 相同的部分在 if 语句里完成,这样就不会在同一个 cell 上叠加很多相同的 view 了

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if ( !cell )
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];   //可以设定 cell 的显示样式为 subTitle
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
        imageView.frame = CGRectMake(15, 2, 40, 40);
        [cell addSubview:imageView];
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(65, 2, 100, 20)];
        label.text = @"Hello";
        [cell addSubview:label];
        UILabel *subLabel = [[UILabel alloc] initWithFrame:CGRectMake(65, 22, 100, 20)];
        subLabel.text = @"你好";
        [cell addSubview:subLabel];
    }
return cell;
}
时间: 2024-10-06 05:16:42

使用可重用 cell 的两种方式的相关文章

Python之面向对象的组合、多态、菱形问题、子类中重用父类的两种方式

一.组合 ''' 1.什么是组合 组合就是一个类的对象具备某一个属性,该属性的值是指向另外一个类的对象 2.为何用组合 组合也是用来解决类与类直接代码冗余问题的 3.如何用组合 ''' # 继承减少代码冗余,但是将类与类进行了强耦合,python不崇尚,所以能不用继承就尽量不用继承 class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age se

重用cell的两种方法

今天在学习IAP的时候无意间看到原来  tableView: cellForRowAtIndexPath:方法中有两个获得重用cell的方法 ,一直以来都是用 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];那下面的这个怎么用呢,感觉比较怪,假设没有重用的岂不是为空了 UITableViewCell *cell = [tableView dequeueReusableCell

089 重用父类方法的两种方式

目录 一.直接调用指定类的方法 二.通过super()关键字 2.1 使用方法 2.2 使用super调用父类方法 2.3 super()的调用顺序 重用父类方法有两种方式: 指名道姓的使用,直接调用指定类的方法 super关键字使用 一.直接调用指定类的方法 指名道姓的使用,跟继承没有关系.但也能完成需求 class Person: school = 'xxx' def __init__(self,name,age): self.name=name self.age=age def study

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端

POI操作Excel详解,HSSF和XSSF两种方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.

ios UI加载xib文件到控制器的两种方式(MS)

X-code6.3 创建xib文件 加载xib文件到控制器的两种方式(MS) // 1.第一种方式 //    NSArray * array = [[NSBundle mainBundle]loadNibNamed:@"cell" owner:nil options:nil]; //    MyTableViewCell * cell = [array firstObject]; 其中cell为新建的xib文件名 // 2.第二种方式 UINib * nib = [UINib nib

内存分配原理 -进程分配内存的两种方式,分别有系统调用完成brk() 和mmap()(不设计共享内存)

如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误.           这两个数值表示一个进程自启动以来所发生的缺页中断的次数. 发成缺页中断后,执行了那些操作? 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0

IOS之解析Html的两种方式

1.最近没什么做的就解析了html的文本来了,在解析的时候会遇到一些问题,但是现在也解决了, 我使用了两种方式去解析Html 页面,现在就来说一下是什么方式去解析的 第一种的方法:使用正则表达式(http://rss.sina.com.cn/sports/basketball/nba.xml 需要解析的数据) 使用多线程的方式去解析html数据: -(void)getNews{ //使用多线程开发 dispatch_async(dispatch_get_global_queue(DISPATCH

em创建的两种方式

em创建(两种方式1,图形dbca,当然了,前提是先创建一个监听. 2,手工命令安装em)手工命令创建em(确保数据库开启,确保监听正常并且最好是动态监听,确保system表空间够用大概1G左右),我的空间有限只给了800M,如下 select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name like 'SYSTEM';alter database datafile '/u01