【免费下载链接】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),仅供参考