资讯专栏INFORMATION COLUMN

【iOS】如何实现Delegate链

lordharrd / 2796人阅读

摘要:实现链广播是中普通使用的设计模式,通常只能指定一级。实现了链,消息会在链上逐级传递,直到到达链表末尾,或者遇到实现了此消息的方法。默认情况下,消息命中第一个方法后不再向下传递,但可以通过在被调用方法内执行设置消息继续向下传递。

CYMDelegateChain@github

实现delegate链/广播

WHY

Delegate是IOS中普通使用的设计模式,通常只能指定一级delegate。但有的时候,比如使用UITableView,如果业务比较复杂,每个section有独立的数据和展示方式,很自然的就会想到把不同的section逻辑封装成不同的类,这时你可能就会希望每个section有自己的delegate。而CYMDelegateChain恰好能帮你做这些事。

WHAT

CYMDelegateChain实现了delegate链,消息会在链上逐级传递,直到到达链表末尾,或者遇到实现了此消息的方法。默认情况下,消息命中第一个方法后不再向下传递,但可以通过在被调用方法内执行CYMDelegateChainContinue(), 设置消息继续向下传递。

CYMDelegateChainInsert: 在链表前端插入delegate

//将section1插入列表前端
CYMDelegateChainInsert(self.dataSource, section1, self);

CYMDelegateChainRemove: 从链表中删除已存在的delegate

//将section1从链表中删除
CYMDelegateChainRemove(self.dataSource, section1, self);

CYMDelegateChainReplace: 从替换已存在的delegate
//将section1从链表中删除

//将section1替换section2
CYMDelegateChainReplace(self.dataSource, section1, section2, self);

CYMDelegateChainContinue: 设置continue标志,指定当前delegate方法返回后,当前调用结束后,继续调用下一个Delegate,可以实现广播

CYMDelegateChainContinue();
HOW

为便于说明,举一个简单的例子:利用CYMDelegateChain,将UITableView的section逻辑独立开来。
下面是关键部分的代码,完整代码请下载源码查看。

封装类,处理section数据

@interface TestTableViewSectionData : NSObject
@property NSInteger sectionId;
@end

@implementation TestTableViewSectionData
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (_sectionId == indexPath.section) { //只处理本section的消息
        //作一些与本section相关的事情
        ...
        return cell;
    }else{
        //非本section的消息,交给其他delegate处理
        CYMDelegateChainContinue();
        return nil;
    }

}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if (_sectionId == section) { //只处理本section的消息
        //作一些与本section相关的事情
        ...
    }else{
        //非本section的消息,交给其他delegate处理
        CYMDelegateChainContinue();
        return 0;
    }
}
@end

封装类,处理TableView数据,如section数量

@interface TestTableViewData : NSObject
@property NSMutableArray* sections;
@end

@implementation TestTableViewData

-(instancetype) init
{
    self = [super init];
    if(self){
        _sections = [[NSMutableArray alloc]init];
    }
    return self;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return _sections.count;
}
@end

扩展UITableView,方便对section的管理

@implementation UITableView(TestSection)

/** 添加section,返回sectionid */
-(NSInteger) addTestSection:(TestTableViewSectionData*) section{
    
    TestTableViewData*data = objc_getAssociatedObject(self, @"__testdata");
    NSInteger sectionId = 0;
    if(!data){
        data = [[TestTableViewData alloc]init];
        objc_setAssociatedObject(self, @"__testdata", data, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        //在链中插入新section,只处理numberOfSectionsInTableView
        CYMDelegateChainInsert(self.dataSource, data, self);
    }
    sectionId = data.sections.count;
    
    section.sectionId = sectionId;
    //在链中插入新section,每个section只处理自己的事件
    CYMDelegateChainInsert(self.dataSource, section, self);
    
    [data.sections addObject:section];
    return sectionId;
}
@end

操作UITableView,插入多个section

- (void)viewDidLoad {
    [super viewDidLoad];
    //测试section
    TestTableViewSectionData* sec0 = [[TestTableViewSectionData alloc]init];
    TestTableViewSectionData* sec1 = [[TestTableViewSectionData alloc]init];
    TestTableViewSectionData* sec2 = [[TestTableViewSectionData alloc]init];
    [_tabView addTestSection:sec0];
    [_tabView addTestSection:sec1];
    [_tabView addTestSection:sec2];
}

查看运行结果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16063.html

相关文章

  • IOS】【UITableView】抽象section,使其拥有独立的delegate

    摘要:上一篇文章如何实现链式或广播调用介绍了如何实现链,同时提供了一个例子,简单的将的抽象,使其拥有独立的。这里对这示例进行完善,使其更具有复用性。封装的使有独立的和。扩展了,提供将对应的事件独立处理的能力。 上一篇文章【iOS】如何实现delegate链式或广播调用介绍了如何实现delegate链,同时提供了一个例子,简单的将UITableView的section抽象,使其拥有独立的del...

    abson 评论0 收藏0
  • 如何实现一个IOS网络监控组件

    摘要:此文由作者朱志强授权网易云社区发布。代码演示核心代码将原方法放在中声明函数指针实现函数使用系统方法的函数指针完成系统的实现在这里获取到了系统方法调用的时机在程序启动后调用对委托模型的监控替换方法时需要指定类名,而的的类并不确定。 此文由作者朱志强授权网易云社区发布。 Mobile Application Monitor IOS组件设计技术分享 背景应用程序性能管理Application...

    xbynet 评论0 收藏0
  • iOS内存管理:从MRC到ARC实践

    摘要:为了解决这个问题,苹果依然保留了的那种弱引用方式。所以,无论苹果,还是有经验的程序员,都建议能不用就尽量不用,能缩短范围就尽量缩短范围。于是突发奇想,想对苹果问一个为什么即苹果为什么要搞一个任何一件事情,都不是毫无来由的。 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。...

    PingCAP 评论0 收藏0
  • iOS事件机制整理

    摘要:事件机制整理目录相关概念事件冲突使用案例相关概念类负责处理事件传递,均继承自它。则需要扩大的响应范围,将事件传递到。此为花边的重写方法,执行自己想要的操作执行一段动画参考文章触摸事件全家桶点击事件和手势冲突深入浅出事件机制 iOS事件机制整理 目录 相关概念 事件冲突 使用案例 相关概念 UIResponder UIResponder类负责处理事件传递,UIView、UIVie...

    xingpingz 评论0 收藏0
  • 智能合约的一种设计结构

    摘要:所以,在设计时,要了解区块链相关知识,这些是出于安全考虑。通过一个智能合约能够管理所有模块,这个是不变的,相当于一个不变的点,用来链接各个模块,保证稳定,相当于在区块链上一直会有一个稳定的地址长期进行服务。 智能合约的设计和传统的应用设计有点不同。传统应用一般为了快速迭代是在产品之后考虑安全,但是 DApp 则需要在产品出来之前就考虑安全问题,它将会关系到账户资产、用户数据等问题,而且...

    evin2016 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<