服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS开发之UITableView详解

iOS开发之UITableView详解

2021-01-16 14:37执着丶执念 IOS

在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信、QQ、新浪微博等软件基本上随处都是UITableView。当然它的广泛使用自然离不开它强大的功能,今天这篇文章将针对UITa

一、uitableview基本介绍

默认的uitableview有2种风格:

  1. uitableviewstyleplain(不分组)
  2. uitableviewstylegrouped(分组)

uitableview中的数据只有行的概念,没有列的概念,uitableview的每行数据就是一个uitableviewcell。
自带的uitableviewcell的类型选择有:

 

复制代码 代码如下:

typedef ns_enum(nsinteger, uitableviewcellstyle) {
    uitableviewcellstyledefault,    // 左侧显示textlabel(不显示detailtextlabel),imageview可选(显示在最左边)
    uitableviewcellstylevalue1,     // 左侧显示textlabel、右侧显示detailtextlabel(默认蓝色),imageview可选(显示在最左边)
    uitableviewcellstylevalue2,     // 左侧依次显示textlabel(默认蓝色)和detailtextlabel,imageview可选(显示在最左边)
    uitableviewcellstylesubtitle    // 左上方显示textlabel,左下方显示detailtextlabel(默认灰色),imageview可选(显示在最左边)
};

 

二、uitableviewdatasource数据源

数据源的作用就是告诉uitableview,我该显示什么数据

 

复制代码 代码如下:

#pragma mark 常用数据源方法
#pragma mark 返回分组数
- (nsinteger)numberofsectionsintableview:(uitableview *)tableview
#pragma mark 返回每组行数
- (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section
#pragma mark 返回每行的单元格
- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath
#pragma mark 返回每组头标题名称
- (nsstring *)tableview:(uitableview *)tableview titleforheaderinsection:(nsinteger)section
#pragma mark 返回每组尾部说明
- (nsstring *)tableview:(uitableview *)tableview titleforfooterinsection:(nsinteger)section

 

计算分组数 -> 计算每组行数 -> 生成分组索引 -> 生成单元格
注意:cellforrowatindexpath只生产当前显示在界面上的单元格

三、uitableviewdelegate代理

代理的作用是告诉uitableview,我该怎么显示和响应

 

复制代码 代码如下:

#pragma mark - 常用代理方法
#pragma mark 设置分组头部的内容高度
- (cgfloat)tableview:(uitableview *)tableview heightforheaderinsection:(nsinteger)section
#pragma mark 设置每行高度(每行高度可以不一样)
- (cgfloat)tableview:(uitableview *)tableview heightforrowatindexpath:(nsindexpath *)indexpath
#pragma mark 设置分组尾部的内容高度
- (cgfloat)tableview:(uitableview *)tableview heightforfooterinsection:(nsinteger)section
#pragma mark 点击了某一行
- (void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath
#pragma mark 设置分组的头部视图
- (uiview *)tableview:(uitableview *)tableview viewforheaderinsection:(nsinteger)section;
#pragma mark 设置分组的尾部视图
- (uiview *)tableview:(uitableview *)tableview viewforfooterinsection:(nsinteger)section;

 

四、uitableview刷新列表方法

 

复制代码 代码如下:

#pragma mark 刷新整个表格
- (void)reloaddata;
#pragma mark 刷新指定的行
- (void)reloadrowsatindexpaths:(nsarray *)indexpaths withrowanimation:(uitableviewrowanimation)animation;
#pragma mark 刷新指定的分组
- (void)reloadsections:(nsindexset *)sections withrowanimation:(uitableviewrowanimation)animation;
#pragma mark 删除时刷新指定的行数据
- (void)deleterowsatindexpaths:(nsarray *)indexpaths withrowanimation:(uitableviewrowanimation)animation;
#pragma mark 添加时刷新指定的行数据
- (void)insertrowsatindexpaths:(nsarray *)indexpaths withrowanimation:(uitableviewrowanimation)animation;

 

五、uitableviewcell的重用机制

在uitableview内部有一个缓存池,专门用来缓存uitableviewcell,因为uitableview不是一下子显示全部cell,而是以 所见即所得 的方式,手机上看的见的cell,才有存在的对象uitableviewcell实例。具体表现如下:

每次显示新的cell的时候,都是先从缓存池中取出对应的uitableviewcell对象,进行 重新初始化 显示。如果缓存池中没有,才创建新的uitableviewcell对象
每当某个cell被移出 可见区域 外后,就会被 回收 到缓存池中
所以尽管要展示的数据巨大,但内存中存在的uitableviewcell也是有限的,极大的降低了对内存的需求。

 

复制代码 代码如下:

# pragma mark 在tableview:cellforrowatindexpath:方法中使用uitableview的重用机制
// 由于此方法调用十分频繁,cell的标示声明成静态变量有利于性能优化
static nsstring *cellidentifier = @"uitableviewcellidentifierkey1";
// 首先根据标识去缓存池取
uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier];
// 如果缓存池没有找到,则重新创建并放到缓存池中
if(!cell){
    cell = [[uitableviewcell alloc] initwithstyle:uitableviewcellstylevalue1 reuseidentifier:cellidentifier];
}

 

六、系统自带的uitableviewcell

iOS开发之UITableView详解

我们基本上很少使用系统自带的uitableviewcell,样式太过于死板了。

七、自定义cell

基本步骤:
自定义类xxxtableviewcell,继承uitableviewcell
重写-(id)initwithstyle:reuseidentifier:方法,添加子控件
最好重写layoutsubview方法,设置子控件frame
然后在uitableview的代理方法tableview:cellforrowatindexpath:中使用重用机制创建该类xxxtableviewcell,再对cell进行初始化

iOS开发之UITableView详解

八、mvc模式

iOS开发之UITableView详解

延伸 · 阅读

精彩推荐
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25