delegate / target, action / block
delegate:
A要执行B的方法, 先声明一个协议(A,B遵循这个协议),在A中声明一个代理的属性,在B中通过 A的对象.delegate = self来实现设置B为A的代理人,这时就可以在A中通过 self.delegate(A的代理)来调用B中的方法了
一般在A的.h中写协议,也可以新建一个协议
@protocol 协议名 <NSObject>
协议方法
@end
声明代理属性,delegate是代理名,自定义的
@property (nonatomic, assign) id<协议名>delegate;
[self.delegate A要执行的方法];
在B中初始化一个A的对象,并设置代理
A *a = [A alloc] init];
a.delegate = self;
target, action:
A要执行B的方法,在A中声明属性 id target 和 SEL action, 在B中通过 A的对象.target = self 和 A的对象.action = @selector(要执行的方法) 来实现类似代理人的操作,同代理一样,此时在A中通过 [self.target performSelector:self.action withObject:self] 就可以调用A要执行的方法了
A的.h中声明属性
@property (nonatomic, assign) id target;
@property (nonatomic, assign) SEL action;
A的.h中调用方法
[self.target performSelector:self.action withObject:self];
在B中初始化一个A的对象,并设置target 和 action
second.target = self;
second.action = @selector(A要执行的方法);
block:
block可以作为属性也可以作为参数
做属性:
A中声明一个block属性
@property (nonatomic, copy) void(^changeColor2)(UIColor *);
block属性名 block的类型
下面这步类似给属性赋值
self.changeColor2([UIColor redColor]);
B中定义一个方法
void (^changeColor)(UIColor *) = ^(UIColor *color){
方法名 参数类型 参数
self.view.backgroundColor = color;
};
block的属性传值(传给了changeColor方法的参数)
A的对象.changeColor2 = changeColor;
做参数:
A中声明一个方法,block作为参数
-(void)changeColor:(void(^)(UIColor *color))block;
方法名 参数类型 参数名
方法的实现
-(void)changeColor:(void (^)(UIColor *))block {
block([UIColor yellowColor]);
}
//也可以先定义block参数,只是写法不同
//typedef void(^Block)(UIColor *color);
//-(void)changeColor:(Block)block;
//方法的实现
//-(void)changeColor:(Block)block {
// block([UIColor yellowColor]);
//}
在B中通过 A的对象 调用方法实现改变B的背景颜色
[A的对象 changeColor:^(UIColor *color) {
self.view.backgroundColor = color;
}];