使用category为delegate和protocol解耦

项目中我们有时候会遇到一些情况,需要经常使用某个代理,但是又不是都需要遵从协议,这时候就可以用我的这种方式完全解耦,一些小东西,欢迎指点和指指点点。下面直接开始:

要是大家闲看的麻烦,可以直接下载:https://github.com/IDwangluting/DeleagateOperation.git

demo 中 总共用了几个文件 ,
Viewcontroller,
newDeleagte.h,
UIViewController+Protocol,
UIViewController+Delegate

然后viewcontroller 中的代码是这样的:

import "ViewController.h"

import "UIViewController+Delegate.h"
import UIViewController+Protocol.h"

@implementation ViewController

-(void)viewDidLoad {
[super viewDidLoad];
self.delegate = self ;
[self addProtocol];
}

-(void)dealloc {
[self removeDelegate];
}

NewDeleagte.h 中的代码在下面,这里只有 协议的申明,

import <Foundation/Foundation.h>

@protocol NewDelegate <NSObject>

-(void)viewWillEnter;

-(void)viewDidEnter;

-(void)viewWillOut;

-(void)viewDidOut;

@end

UIViewController+Protocol.h 中的代码是这样的:

import "NewDelegate.h"

@interface UIViewController (Protocol)

@property (nonatomic,assign)id<NewDelegate> delegate ;

-(void)addProtocol ;

-(void)removeDelegate;

@end

UIViewController+Protocol.m 中的代码在下面,这里遵从了协议

import "UIViewController+Protocol.h"
import <objc/runtime.h>

@implementation UIViewController (Protocol)

-(void)setDelegate:(id<NewDelegate>)delegate {
objc_setAssociatedObject(self, @selector(delegate), delegate, OBJC_ASSOCIATION_ASSIGN);
}

-(id<NewDelegate>)delegate {
return objc_getAssociatedObject(self, @selector(delegate)); ;
}

-(void)addProtocol {

if (self.delegate  && [self.delegate respondsToSelector:@selector(viewWillEnter)]) {
  [self.delegate viewWillEnter];
}

if (self.delegate  && [self.delegate respondsToSelector:@selector(viewDidEnter)]) {
    [self.delegate viewDidEnter];
}

if (self.delegate  && [self.delegate respondsToSelector:@selector(viewWillOut)]) {
    [self.delegate viewWillOut];
}

if (self.delegate  && [self.delegate respondsToSelector:@selector(viewDidOut)]) {
    [self.delegate viewDidOut];
}

}

-(void)removeDelegate {
self.delegate = nil ;
}

UIViewController+Delegate.h 中的代码在下面,这里实现了代理

import "NewDelegate.h"

@interface UIViewController (Delegate) <NewDelegate>

@end

UIViewController+Delegate.m 中的代码是这样的:

import "UIViewController+Delegate.h"

@implementation UIViewController (Delegate)

-(void)viewWillEnter {
NSLog(@" line:%d method:%s",LINE,FUNCTION);
}

-(void)viewDidEnter {
NSLog(@" line:%d method:%s",LINE,FUNCTION);
}

-(void)viewWillOut {
NSLog(@" line:%d method:%s",LINE,FUNCTION);
}

-(void)viewDidOut {
NSLog(@" line:%d method:%s",LINE,FUNCTION);
}

其实这是前几天面试的时候,帮别人解决问题时想的一个方案,他当然大喜过望了。希望对大家有用吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容