Objective-C代理模式精讲:UITableView反向列表库ReverseExtension如何用NSProxy消息转发+DenyList实现多Delegate共存
【免费下载链接】ReverseExtensionA UITableView extension that enables cell insertion from the bottom of a table view.项目地址https://gitcode.com/gh_mirrors/re/ReverseExtension点击查看免费下载这篇文章精讲 Objective-C 代理模式Delegate Pattern的经典实战开源组件 ReverseExtension 是一个让 UITableView 支持从底部插入 cell聊天式反向列表的扩展库。它的内部实现了一个代理中的代理——用NSProxy 消息转发机制forwardInvocation DenyList 黑名单让库自身与开发者业务代码两个 Delegate 在同一个 tableView 上和谐共存。一、为什么会有多Delegate冲突问题UITableView 的delegate属性只能指向一个对象。而反向列表库 ReverseExtension 为了监听滚动、翻转 cell 方向自己也必须实现UITableViewDelegatetableView.re.delegate self // 业务代码想当 delegate tableView.re.dataSource self // 同时业务代码还要当 dataSource此时就出现了矛盾库需要scrollViewDidScroll、willDisplay等方法来翻转视图业务代码也想实现scrollViewDidScroll、tableView(_:didSelectRowAt:)等方法。如果库直接把自己设为tableView.delegate业务回调就全部丢失如果反过来库的功能就失效。 解决思路再造一个代理对象把它设为真正的tableView.delegate由它把消息同时转发给所有感兴趣的实现者——这就是本文的主角 UITableViewDelegateProxy.swift。ReverseExtension 的反向列表效果原理是把 UITableView 和每个 UITableViewCell 整体旋转 180°再对 indexPath 做镜像换算从而从底部插入。二、NSProxy消息转发三件套Objective-C 中一个对象收到自己不会处理的消息时runtime 会依次询问它三件事步骤方法作用1️⃣respondsToSelector:我能不能响应这个方法2️⃣methodSignatureForSelector:给我这个方法的签名参数/返回值类型3️⃣forwardInvocation:帮我把这个NSInvocation转给真正干活的人只要重写这三个方法一个类就能冒充任意数量的 Delegate。核心实现都在 DelegateProxyBase.m- (void)forwardInvocation:(NSInvocation *)anInvocation { for (NSObject *delegate in self.delegates) { if ([delegate respondsToSelector:anInvocation.selector]) { if ([self isDenyDelegateForSelector:anInvocation.selector delegate:delegate]) { continue; // DenyList 命中跳过这个实现者 } [anInvocation invokeWithTarget:delegate]; // 转发给它 } } }注意这里循环遍历所有 delegates而不是找到第一个就返回——所以多个 Delegate 会依次收到同一条消息实现广播式共存。三、DenyList给特定方法指定唯一负责人广播转发有一个副作用如果库和业务代码都实现了tableView(_:willDisplay:forRowAt:)两边都会被调用。但有些方法如 cell 高度、翻转逻辑只能由一方决定否则视图会被翻转两次。ReverseExtension 的解法是引入 DenyDelegateMethod——一条某方法 某 delegate的配对记录interface DenyDelegateMethod : NSObject property (readonly, weak) id delegate; // 被排除的实现者弱引用防循环引用 property (readonly, assign) SEL selector; // 被排除的方法 end它在 DenyDelegateMethod.m 中初始化后被存入一个NSMapTableselector 字符串 → delegate 的字典转发前用isDenyDelegateForSelector:delegate:检查命中黑名单的对象对该方法隐身。在 Swift 侧ReverseExtension.swift 组装了完整的 DenyList把 9 个会翻转视图/产生冲突的方法如willDisplay、heightForHeaderInSection、didSelectRowAt、iOS 11 的左右滑动手势等全部指定为仅库自己处理delegateProxy UITableViewDelegateProxy( delegates: [delegate, self], // 先业务后库 denyList: denied(delegate) { ... } )四、工程细节亮点弱引用持有 delegatesNSHashTable weakObjectsHashTableNSMapTable strongToWeakObjectsMapTable代理不会反向强持有业务对象避免内存泄漏见 DelegateProxyBase.m。自动接管业务代码只需写tableView.re.delegate self库就在didSet里创建 Proxy 并执行base?.delegate delegateProxy见 ReverseExtension.swift。可回退把re.delegate设为nilProxy 销毁tableView 恢复原生行为零侵入。示例工程的完整用法见 ViewController.swifttableView.re.dataSource self tableView.re.delegate self tableView.re.scrollViewDidReachTop { scrollView in print(scrollViewDidReachTop) }五、总结这套模式能迁移到什么场景ReverseExtension 给出的是一个通用的Multi-Delegate 代理模式写一个继承NSObject的 Proxy持有delegates数组弱引用重写respondsToSelector:/methodSignatureForSelector:/forwardInvocation:三件套做广播转发用 DenyList 为独占型方法指定唯一实现者把它设为控件的真实 delegate业务方只面向 Proxy 编程。掌握这套 NSProxy 消息转发 DenyList 的组合拳你在任何需要多个观察者共享一个 delegate 位的场景自定义组件库、埋点 SDK、键盘框架等都能照方抓药。赞分享【免费下载链接】ReverseExtensionA UITableView extension that enables cell insertion from the bottom of a table view.项目地址https://gitcode.com/gh_mirrors/re/ReverseExtension点击查看免费下载相关推荐PokemonGo-DesktopMap深度解析Electron与Python的完美结合PokemonGo DesktopMap深度解析Electron与Python的完美结合 PokemonGo DesktopMap是一款基于Electron框FastStream消息广播一对多消息分发模式实现FastStream消息广播一对多消息分发模式实现 在现代分布式系统中消息广播Broadcast是一种常见的一对多消息分发模式它允许单个生产者将消息同后端消息队列微服务OpenClaw 命令队列Command Queue深入解析多会话并发、队列模式与消息转向机制OpenClaw 命令队列Command Queue深入解析多会话并发、队列模式与消息转向机制 本文系统讲解 OpenClaw 进程内的命令队列CommAI 应用AI Agent交互助手后端即时通讯网关创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Kun 轨迹视图 Harness 对齐重构:密集台账、时间线交互与记录级检查器全解析

Kun 轨迹视图 Harness 对齐重构:密集台账、时间线交互与记录级检查器全解析

人工智能AI Agent自主智能体桌面应用MCP Clients 【免费下载链接】Kun Local-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI. 项目地址: https://gitcode.com/gh_mirrors/de/Kun 点击查…

2026/10/11 14:24:30 阅读更多 →
小学生C++信息学竞赛课程----算法选择与思维训练(1、前言)

小学生C++信息学竞赛课程----算法选择与思维训练(1、前言)

前言:学算法,不只是学会写代码,更是学会思考亲爱的同学、家长朋友们:你好!欢迎来参加汉克老师的信息学竞赛算法教程。在正式学习第一种算法之前,我想先和大家聊一个问题:为什么有些同学学过很多…

2026/10/11 14:24:30 阅读更多 →
OpenGL 4.5+C++复刻我的世界:图形管线与体素渲染实战

OpenGL 4.5+C++复刻我的世界:图形管线与体素渲染实战

简介:这是一份基于OpenGL与C实现的《我的世界》风格方块化3D沙盒游戏源码工程,面向具备C基础和图形编程入门经验的开发者,用于学习现代OpenGL渲染管线、Voxel引擎架构与实时交互逻辑设计。资源共429个文件,包含15个可执行程序&…

2026/10/11 14:24:30 阅读更多 →

最新新闻

GCC四阶段实战:从hello.c到可执行文件的完整编译链

GCC四阶段实战:从hello.c到可执行文件的完整编译链

简介:这是一份面向软件开发初学者与Linux系统使用者的GCC编译器入门指南,聚焦C/C开发环境搭建与核心编译原理。资源以PDF形式呈现,内容覆盖GCC发展沿革、多语言支持能力、跨平台特性及与G的本质区别,重点澄清四大常见误区&#xf…

2026/10/11 15:09:55 阅读更多 →
OVITO数据管道实战:分子模拟轨迹可视化与Python批处理解析

OVITO数据管道实战:分子模拟轨迹可视化与Python批处理解析

简介:OVITO是分子动力学模拟结果可视化的常用工具,这份1个PDF文件(约2.14MB)的手册与总结面向使用LAMMPS开展材料、物理、化学等模拟研究的用户,帮助快速掌握从导入Dump文件到分析原子轨迹的完整流程。内容按三部分梳理…

2026/10/11 15:09:55 阅读更多 →
220V降压24V700mA交转直芯片WT5110

220V降压24V700mA交转直芯片WT5110

220V降压24V700mA交转直芯片WT5110WT5110 是一款适用于非隔离型 AC-DC 降压转换的芯片,支持宽输入电压范围(85VAC~265VAC,部分场景可扩展至 110VAC~265VAC), 可将 220V 交流电转换为稳定的 24V 直流输出,并…

2026/10/11 15:09:55 阅读更多 →
SQL Server AlwaysOn 集群添加只读副本:从裸机到可用组的完整实战指南

SQL Server AlwaysOn 集群添加只读副本:从裸机到可用组的完整实战指南

简介:这份文档面向 SQL Server 数据库管理员与运维工程师,聚焦在已有 Always On 可用性组集群中新增一个数据库节点的完整落地流程,适合具备一定故障转移群集基础、需要横向扩展只读副本或提升高可用能力的技术人员参考。资源包内共 1 个 doc…

2026/10/11 15:09:55 阅读更多 →
SHL真题截图结构化:从PNG到JSON的6步确定性流水线

SHL真题截图结构化:从PNG到JSON的6步确定性流水线

简介:本资源为SHL在线评估测试真题截图整理文档,面向IT、金融、咨询等行业的求职者及HR招聘从业者,助力高效备考数理逻辑、数据解读与商业分析类标准化测评。文档完整呈现22道典型题目及其参考答案(含9处错题标注)&…

2026/10/11 15:09:55 阅读更多 →
2027浙大EMBA提前批面试怎么准备?底层逻辑与实战策略全解析

2027浙大EMBA提前批面试怎么准备?底层逻辑与实战策略全解析

每年到了三四月份,总会有几位在企业里做到中高层的老朋友来找我聊同样的问题:2027年想试试浙大EMBA,提前批面试到底要不要报名?我的回答从来都很干脆——只要你自己评估下来基本条件达标,就一定要申。原因并不复杂&…

2026/10/11 15:08:55 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →