利用代理方法的缺點:
通常我們在自定義工具類或視圖類中進行一些操作之後需要通知視圖控制器,我們都會通過代理來實作。一般實作方法是先定義協定,然後聲明代理屬性,然後在對應方法中調用代理對象的該方法。然後到視圖控制器中,聲明遵守協定 ,設定該類對應的對象的代理為視圖控制器,然後實作對應協定中代理方法。這樣就能完成通知視圖控制器。但是這樣做步驟太多,比較麻煩。接下來介紹一個利用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篇日志。
這樣即可實作通知。