iOS学习笔记-027.UITableViewCell的基本用法

本文详细介绍了UITableViewCell的基本用法,包括其简介、contentView的使用,重点解析了UITableViewCell对象的重用原理,阐述了重用的重要性、工作原理以及注意事项和解决方案。此外,还提供了性能优化的提示和基本的重用案例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UITableViewCell的基本用法

一、UITableViewCell简介

UITableView的每一行都是一个 UITableViewCell ,通过 dataSourcetableView:cellForRowAtIndexPath: 方法来初始化每一行
UITableViewCell是UIView的子类,内部有个默认的子视图:contentView。contentView是UITableViewCell显示内容的父视图,并负责显示一些辅助指示视图。辅助指示视图的作用是显示一个表示动作的图标,可以通过设置 UITableViewCellaccessoryType 来显示,默认是UITableViewCellAccessoryNone,即不显示辅助指示视图 ,其他值如下:
UITableViewCellAccessoryDisclosureIndicator 这里写图片描述
UITableViewCellAccessoryDetailDisclosureButton 这里写图片描述

UITableViewCellAccessoryCheckmark 这里写图片描述

二、UITableViewCell——contentView

contentView下默认有3个子视图,其中的2个是UILabel,通过textLabeldetailTextLabel属性访问,第3个是UIImageView,通过imageView属性访问
UITableViewCell的UITableViewCellStyle,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置,对应样式如下:
UITableViewCellStyleDefault
这里写图片描述
UITableViewCellStyleSubtitle
这里写图片描述

UITableViewCellStyleValue1
这里写图片描述

UITableViewCellStyleValue2
这里写图片描述

三、UITableViewCell对象的重用原理

这个部分和android的ListView、GridView等控件类似。

1.为什么要重用

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

2.重用的原理

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

3.注意事项

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

4.注意事项的解决方案

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

5.关于UITableView性能优化使用的提示

1.创建UITableViewCell时,必须设置一个唯一标示
2.去缓存池取出UITableViewCell时,必须传入一个标示

四、基本的重用案例

1.代码

//
//  ViewController.m
//  03_UIView19_UITableVIew4_cell重用
//
//  Created by 杞文明 on 16/1/2.
//  Copyright © 2016年 杞文明. All rights reserved.
//

#import "ViewController.h"

@interface ViewController (){
    UITableView * _tableView;
    //数据
    NSMutableArray* _dataListM;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createTableView];
    [self loadData];
}

/**创建UITableView*/
-(void)createTableView{
    //1.初始化
    _tableView = [[UITableView alloc]initWithFrame:self.view.bounds];

    //2.设置数据源
    [_tableView setDataSource:self];

    //3.设置代理
    [_tableView setDelegate:self];

    //4.添加到view中
    [self.view addSubview:_tableView];
}

/**数据初始化*/
-(void)loadData{
    _dataListM = [[NSMutableArray alloc]init];
    for (NSInteger i=1; i<=10000; i++) {
        NSString* itemStr = [NSString stringWithFormat:@"这是item %05ld",i];
        [_dataListM addObject:itemStr];
    }
}


/**返回总共拥有多少行*/
-(NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
     NSLog(@"numbers ==================");
    return _dataListM.count;
}

/**每个view的显示 重用*/
-(UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath{
    //1.设置一个标示符
    static NSString* identifier = @"UITalbeViewCell";

    //2.到缓存池中查找有木有拥有这个这个标示符的可用对象
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    //3.如果没有创建一个
    if(cell==nil){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }

    //4.设置数据
    cell.textLabel.text = _dataListM[indexPath.row];

    //5.我们打印一下对象的地址
    NSLog(@"cell---%p-----%ld----String--%p",cell,indexPath.row,identifier);

    //6.放回
    return cell;
}


@end

2.图示

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值