UIKit中的常用控件(三):UITableView

本篇博客主要介绍UITableView这个极度重要、使用最广泛的UI控件


一、设置数据源

  • 为tableView的dataSource设置数据源,通常将控制器设为数据源
  • 数据源需要遵守UITableViewDataSource协议
  • 实现以下数据源方法
  • numberOfSectionsInTableView: 返回组的个数(可选,默认为1)
  • tableView: numberOfRowsInSection: 返回每个组的行数
  • tableView: cellForRowAtIndexPath: 在这个方法中配置每一行的数据
  • tableView: titleForHeaderInSection:设置分组的头部标题
  • tableView: titleForFooterInSection:设置分组的尾部标题

二、UITableView的常见属性

  • rowHeight 行高。默认为44

  • sectionHeaderHeight/sectionFooterHeight 组头部/尾部的高度

  • separatorColor 分割线颜色

  • separatorStyle 分割线的样式

  • SingleLine 默认样式,单行

  • SingleLineEtched 与上面那个一样,但仅支持在grouped样式的tableView中显示

  • None 无分割线

  • tableHeaderView/tableFooterView 整个tableView的头部或尾部控件

</br>

三、UITableViewCell的常见属性

  • contentView 子控件,其包含了textLabel、imageView、detailTextLabel三个子控件
  • accessoryType 右侧按钮类型
  • accessoryView 右侧视图(优先级较高,设置后会覆盖掉右侧按钮)
  • selectionStyle 选中样式
  • backgroundColor 背景颜色
  • backgroundView 背景View
  • selectedBackgroundView 选中时的背景View

</br>

四、UITableViewCell的代理

  • 为tableView的delegate设置代理,通常将控制器设为代理
  • 代理对象需要遵守UITableViewDelegate协议
  • 实现以下代理方法
  • tableView: didSelectRowAtIndexPath: 监听用户选中了某一行
  • tableView: didDeselectRowAtIndexPath: 监听用户取消了某一行的选中

</br>

五、UITableView的性能优化

Apple的优化策略:
  1. 懒加载,只有需要显示的行,才创建对应的cell
  2. 循环利用。离开tableView的cell暂时放到缓存池中,需要显示的新的cell先尝试从缓存池中
实现方式:
  • tableView: cellForRowAtIndexPath:方法中,对tableView调用dequeueReusableCellWithIdentifier:方法,尝试在缓存池中取一个唯一标识符与参数一致的tableViewCell
  • 未取到可用的cell,则调用initWithStyle: reuseIdentifier:方法创建一个新的cell。需要在参数中传入一个唯一标识符,便于后续取出cell来重用
  • 也可以在viewDidLoad方法中调用registerClass:forCellReuseIdentifier:方法来注册一个重用cell标识。这样当缓存池没有可用的cell时,会自动创建cell
tips:
  • 类似于backgroundColor这样的一次性设置(每一行都一样且始终不变),可以放到if语句中,提高性能。

</br>

六、实现索引条

  • 实现sectionIndexTitlesForTableView:方法,创建一个表示索引条的数组并返回。
  • 通过sectionIndexColor属性可以设置索引条中的文字颜色
  • 用过sectionIndexBackgroundColor属性可以设置索引条的背景颜色

</br>

</br>

七、自定义Cell

自动计算行高的方法:

  • 设置rowHeight属性为UITableViewAutomaticDimension
  • 设置一个估算高度estimatedRowHeight

</br>

八、数据刷新

1.全局刷新

修改数据源中模型的数据,再对tableView调用reloadData方法即可

2.局部刷新

调用reloadRowsAtIndexPaths:withRowAnimation:方法,可以指定刷新指定索引位置的数据,并设定刷新时的动画形式

3.添加数据时的局部刷新

添加数据时,调用insertRowsAtIndexPaths:withRowAnimation:方法,即可在指定位置处播放cell增加的动画

4.删除数据时的局部刷新

删除数据时,调用deleteRowsAtIndexPaths:withRowAnimation:方法,即可在指定位置处播放cell增加的动画

</br>

九、左滑删除

  1. 设置代理
  2. 实现协议中的tableView: commitEditingStyle: forRowAtIndexPath:即可实现左滑删除,并在方法中删除掉模型中的数据、调用删除动画方法。
  3. 修改左滑删除按钮的文字
    实现协议中的tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:方法,返回一个字符串,即可修改删除按钮中的文本

</br>

十、左滑出现多个按钮

实现协议中的tableView:editActionsForRowAtIndexPath:方法,返回一个包含了所有按钮的数组即可

  • 通过UITableViewRowAction的类方法rowActionWithStyle:title:handler:方法创建即可创建一个按钮,并在handler这个block类型的参数中设置点击时触发的操作即可

</br>

十一、编辑模式

  • 修改tableView的editing属性为YES即可直接进入编辑模式
  • 调用setEditing:animated:方法也可进入编辑模式,参数传入YES则有动画

十二、编辑模式下多选

设置tableView的allowsMutipleSelectionDuringEditing属性为YES,即可在进入编辑模式时允许多选。
调用tableView的indexPathsForSelectedRows方法可以获取到用户在编辑模式下所选中的所有Cell的索引

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容