一文掌握UITableViewCell-Swipe-for-Options的三个Delegate回调与ShouldHideMenu通知机制
2026/8/27 17:17:37 网站建设 项目流程

一文掌握UITableViewCell-Swipe-for-Options的三个Delegate回调与ShouldHideMenu通知机制

【免费下载链接】UITableViewCell-Swipe-for-OptionsA reproduction of the iOS 7 Mail app's swipe-to-reveal options项目地址: https://gitcode.com/gh_mirrors/ui/UITableViewCell-Swipe-for-Options

UITableViewCell-Swipe-for-Options 是一款复刻 iOS 7 邮件应用「左滑单元格显示操作按钮」体验的 Objective-C 开源库,只需设置 delegate 即可为 UITableView 加上 Mail 风格的More / Delete 左滑菜单。本文带你一文掌握它的三个 Delegate 回调ShouldHideMenu 通知机制:每个事件何时触发、触发链路是什么、又该在哪个回调里完成你的业务逻辑。


一、先看整体:一个 Cell 里的「滑动机关」⚙️

库的核心只有一对文件:

  • 接口定义:TLSwipeForOptionsCell.h
  • 实现逻辑:TLSwipeForOptionsCell.m

TLSwipeForOptionsCellUITableViewCell的子类,内部藏了一个横向UIScrollView:内容区比普通 cell 宽出148pt(源码常量kCatchWidth,见 TLSwipeForOptionsCell.m),多出来的部分正好放两个按钮——灰色的More和红色的Delete

// 在 cellForRowAtIndexPath 中三步接入 TLSwipeForOptionsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; cell.textLabel.text = ...; cell.delegate = self; // ← 必须设为实现了协议的对象(通常是 VC)

💡 由于 cell 会被复用,一定要在cellForRowAtIndexPath:里每次都设置 delegate,而不是只在加载时设置一次。


二、三个 Delegate 回调逐一拆解 🔍

协议TLSwipeForOptionsCellDelegate定义了 3 个方法(见 TLSwipeForOptionsCell.h),全部必选(没有@optional):

回调方法触发时机典型用途
cell:didShowMenu:左滑到达阈值(YES)/ 菜单收回隐藏(NO)锁定表格滚动、加遮罩层
cellDidSelectDelete:点击红色Delete按钮删除对应行
cellDidSelectMore:点击灰色More按钮弹出 ActionSheet

回调①:cell:didShowMenu:—— 菜单显隐的「状态汇报」

这是唯一带参数的回调,BOOL isShowingMenu表示菜单展开还是收起。触发点在 scrollViewDidScroll::滑动偏移量达到148pt时上报YES,偏移量归零时上报NO

Demo 中的处理非常典型(TLTableViewController.m):

  • 菜单展开时:[self.tableView setScrollEnabled:NO]锁住表格滚动,并铺一层透明TLOverlayView拦截点击;
  • 菜单收起时:移除遮罩、恢复其他 cell 的交互。

📌 注意:这是双向回调——无论是用户右滑关闭、点了 Delete、还是收到通知被强制关闭,都会收到一次didShowMenu:NO,它是你「清理现场」的统一出口。

回调②:cellDidSelectDelete:—— 按下红色 Delete 按钮

用户点击 Delete 时,cell 会先回调你,然后自动把菜单滑回去(TLSwipeForOptionsCell.m):

- (void)userPressedDeleteButton:(id)sender { [self.delegate cellDidSelectDelete:self]; [self.scrollView setContentOffset:CGPointZero animated:YES]; // 自动收起 }

所以你只需要在这个回调里删数据,收带动画交给库完成(Demo 的实现见 TLTableViewController.m)。

回调③:cellDidSelectMore:—— 按下灰色 More 按钮

这是三个回调里最容易踩坑的一个:点击 More 后,cell只转发事件,不会自动收起菜单(TLSwipeForOptionsCell.m)。菜单会一直停留在展开状态,直到你主动让它关闭——这正是 ShouldHideMenu 通知登场的地方(见下节)。

Demo 的用法是弹出一个 ActionSheet 提供「Flag / Mark as Unread / Move to Junk」等选项(TLTableViewController.m)。


三、ShouldHideMenu 通知机制:为什么「藏菜单」不用 Delegate?📢

先说结论:Delegate 是「点对点」,通知是「广播」,而藏菜单恰恰需要广播。

  • Delegate 链路:cell → VC,只能处理单个cell 的事件;
  • 但「收起菜单」往往要同时作用于所有cell(比如用户开始滚动表格、进入编辑模式时),VC 不可能逐个找到每个 cell 去调方法。

于是库设计了通知常量TLSwipeForOptionsCellShouldHideMenuNotification(声明见 TLSwipeForOptionsCell.h,字符串值定义在 TLSwipeForOptionsCell.m)。

工作机制分三步,形成完整闭环:

  1. 注册:每个 cell 创建时都会监听该通知(TLSwipeForOptionsCell.m),且监听的是object:nil——不管谁发、带什么 object,都会响应;
  2. 接收:收到通知后调用 hideMenuOptions,把内部 scrollView 的偏移量动画归零;
  3. 回调:偏移量归零会再次触发scrollViewDidScroll:,从而自动回调cell:didShowMenu:NO——VC 无需额外代码即可完成「解锁滚动、移除遮罩」等收尾。

Demo 中 6 个 post 通知的真实场景

#场景代码位置
1屏幕旋转(保持布局一致)TLTableViewController.m
2插入新行(表格被程序滚动)TLTableViewController.m
3进入 / 退出编辑模式TLTableViewController.m
4用户手指开始滚动表格TLTableViewController.m
5点击菜单 cell 以外的区域(遮罩层 hitTest)TLTableViewController.m
6ActionSheet 选择非删除类操作后TLTableViewController.m

发通知的写法只有一行:

[[NSNotificationCenter defaultCenter] postNotificationName:TLSwipeForOptionsCellShouldHideMenuNotification object:self.tableView];

四、协作全景:一次「左滑 → More → 操作完成」的完整链路 🔄

把回调与通知串起来,就是一条清晰的事件链:

  1. 用户左滑 → 偏移量达到 148pt → 触发didShowMenu:YES→ VC 锁定表格滚动、铺开遮罩层;
  2. 用户点击 More → 触发cellDidSelectMore:→ VC 弹出 ActionSheet(菜单保持展开);
  3. 用户选中某项操作 → VC post ShouldHideMenu 通知 → 所有 cell 执行hideMenuOptions→ 菜单动画收起 → 自动触发didShowMenu:NO→ 遮罩移除、滚动解锁。

💡 这套设计值得新手学习:具体事件走 Delegate(精确、带上下文),批量控制走通知(广播、解耦),两者在didShowMenu:NO处交汇闭环。


五、新手接入清单 ✅

  • 表格使用TLSwipeForOptionsCell,并在cellForRowAtIndexPath:每次设置cell.delegate = self
  • 实现全部 3 个 delegate 方法(协议无 optional 方法)
  • cell:didShowMenu:YES中锁定表格滚动,NO中恢复
  • 记住More 按钮不会自动收起菜单,操作完成后手动 post ShouldHideMenu 通知
  • 程序化滚动、切换编辑模式、屏幕旋转时,记得 post 通知让菜单让位

掌握这套「3 回调 + 1 通知」的协作机制,你就完全掌握了这个库的核心,可以放心在自己的项目中复刻 iOS 7 邮件的经典左滑体验了。

【免费下载链接】UITableViewCell-Swipe-for-OptionsA reproduction of the iOS 7 Mail app's swipe-to-reveal options项目地址: https://gitcode.com/gh_mirrors/ui/UITableViewCell-Swipe-for-Options

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询