利用代理方法的缺点:
通常我们在自定义工具类或视图类中进行一些操作之后需要通知视图控制器,我们都会通过代理来实现。一般实现方法是先定义协议,然后声明代理属性,然后在对应方法中调用代理对象的该方法。然后到视图控制器中,声明遵守协议 ,设置该类对应的对象的代理为视图控制器,然后实现对应协议中代理方法。这样就能完成通知视图控制器。但是这样做步骤太多,比较麻烦。接下来介绍一个利用block来完成通知的方法。
使用block:
首先在自定义类中声明一个block类型的属性,然后将需要传出的参数设为block的参数,下面通过具体实例来进行说明:
@interface CYLView : UIView
@property (nonatomic, copy) void (^CYLViewBlock)(UIButton *btn);
@end
首先自定义一个视图类,该类拥有一个block属性。该类用xib描述view,上面有一个按钮,要实现点击按钮时通知视图控制器打印出点击的按钮。
该类的实现文件如下图所示:
@implementation CYLView
- (IBAction)btnClick:(UIButton *)sender
{
if (self.CYLViewBlock) self.CYLViewBlock(sender);
}
@end
在点击按钮时,判断block属性是否有值,有的话就执行该段block
视图控制器中的代码如下:
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CYLView *view = [[[NSBundle mainBundle]loadNibNamed:@"CYLView" owner:nil options:nil]lastObject];
view.frame = CGRectMake(0, 100, 300, 300);
view.CYLViewBlock = ^(UIButton *btn){
NSLog(@"%@",btn);
};
[self.view addSubview:view];
}
@end
将按钮点击后要传入的代码放入block即可。注意这段block中使用self时要声明为弱引用,否则会造成循环引用。具体请参照第8篇日志。
这样即可实现通知。