iOS学习之UITableView
一、UITableView的概念
- UITabelView继承于UIScrollView,可以滚动。
@interface UITableView : UIScrollView <NSCoding>
- UITableView的每一条数据对应的单元格叫做Cell,是UITableViewCell的一个对象,继承于UIView。
@interface UITableViewCell : UIView <NSCoding, UIGestureRecognizerDelegate>
- UITableView可以分区显示,每一个分区称为section,每一行称为row,编号都从0开始。
- 系统提供了一个专门的类来整合section和row,叫做NSIndexPath。
- UITableView的分区,叫做section;每一行,叫做row。
二、UITableView的基本使用
- UITableView的创建
// 创建对象
// 初始化对象并设置样式
// 系统为我们提供了两种样式(UITableViewStyleGrouped,UITableViewStylePlain)
self.tableView = [[UITableView alloc] initWithFrame:self.bounds style:UITableViewStylePlain];
- UITableView显示的相关属性
// 设置分割线颜色(Plain样式下)
self.tableView.separatorColor = [UIColor blackColor];
// 设置分割线的样式
self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
// 设置行高
self.tableView.rowHeight = ;
// 添加头视图,脚视图
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(, , self.frame.size.width, )];
headerView.backgroundColor = [UIColor grayColor]; UIView *footView = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height - 200, self.frame.size.width,200)]; footView.backgroundColor = [UIColor grayColor]; self.tableView.tableHeaderView = headerView; self.tableView.tableFooterView = footView;
三、UITableView显示数据
- UITableView中有两个重要的属性:
// 显示数据相关的代理 @property (nonatomic, weak, nullable) id<UITableViewDataSource> dataSource; // 视图操作相关的代理 @property (nonatomic, weak, nullable) id<UITableViewDelegate> delegate;
- UITableView代理的实现代码
// 设置TableView数据源代理
self.rootView.tableView.dataSource = self; // 设置TableView代理
self.rootView.tableView.delegate = self;
- UITableView的DataSource是负责给UITableView对象提供数据的代理,遵循UITableViewDataSource协议。协议中有两个必须实现的协议方法:
// 每一个分区显示的行数(当前方法必须实现) - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; // 返回cell对象,每一行显示的内容(当前方法必须实现) - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
- UITableView的每一个单元格是UITableViewCell类的对象,继承于UIView。UITableViewCell默认提供了3个视图属性:
// 标题视图
cell.textLabel.text = [NSString stringWithFormat:@"朋友圈%ld", indexPath.row];
// 副标题视图
cell.detailTextLabel.text = @"分享";
// 图片视图
cell.imageView.image = [UIImage imageNamed:@"Action_Moments"];
// 右侧配件(系统样式)
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// 右侧配件(自定义样式)
cell.accessoryView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Expression_3"]];
四、UITableViewCell的重用机制
- 按照上面的方法,如果tableView要显示成百上千条数据时,会因创建过多的cell而导致内存过大程序不能运行。
- 因此UITableView有一个重用池机制管理cell,目的是使用尽可能少的cell显示所有数据。
- UITableView重用Cell的流程:
1)当一个cell被滑出屏幕,这个cell会被系统放到相应的重用池中。
2)当tableView需要显示一个cell,会先去重用池中尝试获取一个cell。
3)如果重用池没有cell,就会创建一个cell。
4)取得cell之后会重新赋值进行使用。
#pragma mark UITableViewCell重用的第一种方法
// 返回cell对象
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"cell";
// 1.优先从重用队列中查找标识符为cell的UITableViewCell对象
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
// 如果cell为空,说明重用队列中没有标识符为cell的对象,那么创建标识符为cell的UITableViewCell的对象
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
}
// 设置cell显示的数据
cell.textLabel.text = @"阿福";
return cell;
}
#pragma mark UITableViewCell重用的第二种方法
// 第一步:注册cell
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
// 第二步:根据重用标识符查找cell
// 如果在重用池中找到就返回,找不到就会自动创建一个并返回
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
五、UITableView和数组的结合使用
- 在延展里定义数组:
// 定义数组用来存放所有的数据 @property (nonatomic, strong) NSMutableArray *dataArray;
- 初始化大数组
// 初始化大数组
self.dataArray = [NSMutableArray arrayWithArray:@[@"女神", @"傻逼", @"晒到", @"而且"]];
- 实现协议方法
// tableView每个分区要显示的个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// 根据元素个数设置行数
return self.dataArray.count;
}
// 返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// cell重用
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
// 根据row从数组中取值
cell.textLabel.text = self.dataArray[indexPath.row];
return cell;
}
六、UITableView的常用协议方法
// 设置分区个数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
// 设置每一个cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
// 设置分区头的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
// 设置分区尾的高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
// 自定义header视图
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
// 自定义footer视图
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
// 点击cell
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
// 设置分区头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
// 设置分区尾标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
// 设置分区索引
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView;
iOS学习之UITableView的更多相关文章
- iOS学习之UITableView中Cell的操作
接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...
- iOS学习之UITableView编辑
一.UITableView编辑 UITableView编辑(删除.添加)步骤: 让TableView处于编辑状态. 协议设定:1)确定Cell是否处于编辑状态:2)设定cell的编辑样式(删除.添加) ...
- ios学习笔记 UITableView(纯代码) (二)
头文件 --------------------------------------------- #import <UIKit/UIKit.h> /** UITableViewDataS ...
- ios学习笔记 UITableView(纯代码) (一)
参考 “https://www.cnblogs.com/ai-developers/p/4557487.html” UITableViewCell 有一个代码重用 减少资源的浪费 参考 https: ...
- iOS学习笔记之UITableViewController&UITableView
iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论 ...
- iOS学习笔记(4) — UITableView的 重用机制
iOS学习笔记(4) — UITableView的 重用机制 UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的 ...
- iOS开发系列--UITableView全面解析
--UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是U ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
随机推荐
- js中字符串,数字之间转换的常用方法
var number={ num:, num1:"2你好" }; //将数字转换为字符串 var str=number.num.toString();//十进制 );//二进制 ) ...
- 使用ffmpeg快速生成视频截图
1 ffmpeg -i input.mkv -ss 00:10:00 -f image2 output.jpg 但是这个命令会花费相当长的时间. 对一个清晰的或者较大的视频文件进行操作, 会花费半分钟 ...
- C# 后台请求web服务方法
/// <summary> /// 传输方法 /// </summary> /// <param name ...
- 关于java classpath问题
在配置java环境的时候,有一个classpath,这是jre寻找.class文件的路径.一般会设置为当前路径".;%JAVA_HOME%\lib;",前面的.为当前路径 如果没有 ...
- hadoop-集群管理(2)——内存设置
http://www.cnblogs.com/yuechaotian/archive/2013/03/08/2949607.html 1. 内存 hadoop为各个守护进程(namenode,seco ...
- 对于返回void类型的asyc的异步方法,如何修改,能使用await
下面是使用WebClinet 获取百度首页的html代码,一般的写法如下: private void Button_Click(object sender, RoutedEventArgs e) { ...
- SubsetsTotal Accepted:49746Total Submissions:176257My Submissions
Subsets Total Accepted: 49746 Total Submissions: 176257My Submissions Given a set of distinct intege ...
- DPDK中断机制简析
DPDK通过在线程中使用epoll模型,监听UIO设备的事件,来模拟操作系统的中断处理. 一.中断初始化 在rte_eal_intr_init()函数中初始化中断.具体如下: 1.首先初始化intr_ ...
- 设置peoplecode trace
Configuring PeopleCode Trace Select PeopleTools, Utilities, Debug, Trace PeopleCode to access the Tr ...
- winform之excel导入和导出
引用命名空间 using Microsoft.Office.Interop.Excel;DataGridView 导出到Excel public static void SaveAs(DataGr ...