uitableViewCell 左滑多个按钮

2024-08-21 08:58

本文主要是介绍uitableViewCell 左滑多个按钮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

轻松学习之四--最简化原生效果集成UITableViewCell左滑多个按钮

字数1113  阅读2256  评论3 

侧滑删除是iOS中非常容易实现的一种效果,你只需要为你的UITableViewDataSource重写这个方法,系统就会自动添加这种操作。

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

gif_01.gif

从iOS8开始,苹果开放了这样一个API:

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

返回一个UITableViewRowAction数组,每一个"Action"代表一个侧滑删除的Button。这样侧滑每一行Cell可以有更多按钮提供给用户交互。


gif_02.gif

不幸地是这个API只在iOS8才有,这样iOS8以下就没办法使用到这种效果。这种情况下我们不得不使用第三方库或者自己重写UITableViewCell来“模拟”出这种效果,当然有几个库在侧滑控件上已经做得非常成熟了(这里我就推荐一个精品:https://github.com/MortimerGoro/MGSwipeTableCell 支持多种侧滑模式,算得上是侧滑控件里的玛莎拉蒂)。


但是,如果你跟我一样,更喜欢苹果的原生效果,又想在iOS8系统以下使用,那么你也许可以试下这个库 JZTableViewRowActionhttps://github.com/JazysYu/JZTableViewRowAction
只要拖两个.m文件到工程里,你的iOS8以下设备也就会自动集成这种效果了。


虽然我还是建议你至少要下载使用一次并阅读一下我的源码,不过你仍然可以在没有任何准备的情况下来看下面的讲解(下面的内容只围绕iOS8系统版本以下):

我的做法是,在侧滑出来的View(那个红色的"Delete" button),上面增加若干个我们想要的Button,所以需要找到一个合适的时机去做这个事情,我们知道,UITableViewCell有一个

- (void)willTransitionToState:(UITableViewCellStateMask)state

方法,当用户在某一行刚开始进行侧滑并且侧滑的Button还没有展现出来时,state的值就为 UITableViewCellStateShowingDeleteConfirmationMask,这个时机就再合适不过,但是,由于Cell的侧滑View是懒加载,所以这时它还没有被创建出来,但要等到与之对应的方法

- (void)didTransitionToState:(UITableViewCellStateMask)state

调用的话,却又已经展现给用户了,为时已晚,能想到的最好、最稳定的时机就是只要一过 willTransitionToState:这个方法,就开始“改造”这个View,所以最好的办法就是延时,只要这个方法一过,侧滑的View就会被创建了,之后我们可以通过遍历UICollectionViewCell的Subviews找到这个View,我们在这里模拟UITableView调用一次UITableViewDataSource的这个方法来获取外部创建的UITableViewRowAction数组:

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

pic_01.png

根据数组里的每一个"rowAction"在这个View上面增加对应个数的UIButton就可以了。

但是这样返回的数组会永远是空,没错,因为UITableViewRowAction这个类在iOS8以下根本不存在,所以我们需要自己创建一个叫做UITableViewRowAction的类,再把它当作普通NSObject帮我们储存一些信息就好了,于是,在阅读@我就叫Sunny怎么了的FDStuckView源码后给我带来了许多灵感,按照他的思路,我们新建一个与UITableViewRowAction接口一模一样的类JZTableViewRowAction,在程序运行时创建一个叫UITableViewRowAction的类作为JZTableViewRowAction的子类,最后把它注册到运行时中去,这样我们就拥有了一个“很像”UITableViewRowAction类。


pic_03.png

pic_02.png

这里可能有些朋友会有疑问,为什么要创建一个JZTableViewRowAction并且根本没有用到?这个问题可以这样回答你:如果你不创建它的话,你就需要写更多的运行时代码来为你新创建的UITableViewRowAction增加方法、属性等等,所以,相比于这个情况,我更喜欢利用继承的特性来做。这样就实现了我们想要的效果:


gif_03.gif

最后JZTableViewRowAction同时也支持给侧滑控件的按钮设置图片,设置enable状态,除非必要,未来也许会增加更多可自定义接口,欢迎学习或使用https://github.com/JazysYu/JZTableViewRowAction。

我更喜欢写一些抛砖引玉的文章分享给大家,希望能给大家带来些许灵感,也欢迎微博@J_雨 一起探讨。One should coding to live,not live to coding :-).

这篇关于uitableViewCell 左滑多个按钮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092702

相关文章

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh