尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

一文掌握UITableViewCell-Swipe-for-Options的三个Delegate回调与ShouldHideMenu通知机制 一文掌握UITableViewCell-Swipe-for-Options的三个Delegate回调与ShouldHideMenu通知机制【免费下载链接】UITableViewCell-Swipe-for-OptionsA reproduction of the iOS 7 Mail apps swipe-to-reveal options项目地址: https://gitcode.com/gh_mirrors/ui/UITableViewCell-Swipe-for-OptionsUITableViewCell-Swipe-for-Options 是一款复刻 iOS 7 邮件应用「左滑单元格显示操作按钮」体验的 Objective-C 开源库只需设置 delegate 即可为 UITableView 加上 Mail 风格的More / Delete 左滑菜单。本文带你一文掌握它的三个 Delegate 回调与ShouldHideMenu 通知机制每个事件何时触发、触发链路是什么、又该在哪个回调里完成你的业务逻辑。一、先看整体一个 Cell 里的「滑动机关」⚙️库的核心只有一对文件接口定义TLSwipeForOptionsCell.h实现逻辑TLSwipeForOptionsCell.mTLSwipeForOptionsCell是UITableViewCell的子类内部藏了一个横向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。工作机制分三步形成完整闭环注册每个 cell 创建时都会监听该通知TLSwipeForOptionsCell.m且监听的是object:nil——不管谁发、带什么 object都会响应接收收到通知后调用 hideMenuOptions把内部 scrollView 的偏移量动画归零回调偏移量归零会再次触发scrollViewDidScroll:从而自动回调cell:didShowMenu:NO——VC 无需额外代码即可完成「解锁滚动、移除遮罩」等收尾。Demo 中 6 个 post 通知的真实场景#场景代码位置1屏幕旋转保持布局一致TLTableViewController.m2插入新行表格被程序滚动TLTableViewController.m3进入 / 退出编辑模式TLTableViewController.m4用户手指开始滚动表格TLTableViewController.m5点击菜单 cell 以外的区域遮罩层 hitTestTLTableViewController.m6ActionSheet 选择非删除类操作后TLTableViewController.m发通知的写法只有一行[[NSNotificationCenter defaultCenter] postNotificationName:TLSwipeForOptionsCellShouldHideMenuNotification object:self.tableView];四、协作全景一次「左滑 → More → 操作完成」的完整链路 把回调与通知串起来就是一条清晰的事件链用户左滑 → 偏移量达到 148pt → 触发didShowMenu:YES→ VC 锁定表格滚动、铺开遮罩层用户点击 More → 触发cellDidSelectMore:→ VC 弹出 ActionSheet菜单保持展开用户选中某项操作 → 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 apps swipe-to-reveal options项目地址: https://gitcode.com/gh_mirrors/ui/UITableViewCell-Swipe-for-Options创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表