iOS分享,ios分享功能
在項目開發中,常常會涉及到對象之間的通訊,而為了降低對象間的耦合,會採用delegate、notificationCenter、block三種方式來進行實現,對於他們的使用,也許大家都能熟練掌握,但是對於如何建立,初學者也許只是一知半解,本文不講長篇大論,僅通過簡單的執行個體來協助大家學習三者的使用,希望對尚不瞭解以上三者的朋友能帶來一定的協助。
一、delegate
估計大家最常用的delegate就是UITableViewDelegate了,那麼我們如何自己寫一個代理呢?我們常常會在控制器中監聽某個視圖中按鈕的點擊,就以此為例。假如在DTestView中有一個Button,我們要在DTestViewController中對這個按鈕的點擊進行監聽,並在點擊Button時傳遞一個數組給DTestViewController,那麼代碼如下:
//1、在DTestView.h檔案中聲明協議並建立協議方法@class DTestView;@protocol DTestViewDelegate <NSObject>@optional/**點擊按鈕並傳遞數組資訊*/- (void)dTestViewDidClickBtn:(DTestView*)dTestView withArr:(NSArray *)position;@end//2、在DTestView.h檔案中聲明delegate屬性
@interface DTestView : UIView
@property (nonatomic, weak) id <DTestViewDelegate> delegate;@end
//3、在DTestView.m檔案中Button的點擊事件裡調用delegate的協議方法- (void)btnClick { if ([self.delegate respondsToSelector:@selector(dTestViewDidClickBtn:withArr:)]) { NSArray *arr = @["test", "delegate"]; [self.delegate dTestViewDidClickBtn:self withArr:arr]; } }
建立代理總共就3步,怎麼樣,是不是很簡單?但是這之中也有幾個需要注意的地方:
1、命名規範:類名+Delegate。
2、@optional關鍵字:遵循協議後,該協議方法可以不實現,協議方法預設為@required修飾,即遵循協議後必須實現該方法,建議不是必須實現的方法都用@optional修飾。
3、ARC環境下,delegate屬性用weak修飾。
4、在調用代理方法前,利用respondsToSelector:方法判斷代理方法是否存在。
以上就是建立delegate時的注意事項,大家可以思考下為什麼要這麼做,如有不明白的地方,歡迎提問,如有不對的地方,歡迎指正。
接下來就是delegate的使用了,簡單說下,也是3步:
//1、設定代理- (void)viewDidLoad { [super viewDidLoad]; dTestView *view = [[dTestView alloc] init]; view.delegate = self; [self.view addSubview:view]; }//2、遵循協議@interface DTestViewController ()<DTestViewDelegate>//3、實現協議方法- (void)dTestViewDidClickBtn:(DtestView *)dTestView withArr:(NSArray *)arr { NSLog(@"%@", arr);}
好了,這就是一個簡單的delegate的建立與使用。
二、notificationCenter
通知中樞相對簡單,仍以監聽按鈕點擊並傳遞一個數組為例,在NTestView中發布通知:
//在Button的addTarget點擊事件中發布通知- (void)btnClick { NSArray *arr = @[@"test", @"notificationCenter"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"點擊按鈕" object:nil userInfo:arr];}
完了?完了,就這麼簡單,接下來在NTestViewController中添加觀察者:
//添加觀察者- (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nTestViewDidClickBtn:) name:@"點擊按鈕" object:nil];}/**接收到通知時調用該方法*/- (void)nTestViewDidClickBtn:(NSNotification *)note { NSArray *arr = note.userInfo; NSLog(@"%@", arr);}//移除觀察者- (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self];}
解釋一下參數:
name:通知的名稱
object:需要傳遞的對象
userInfo:發布通知是傳遞的資訊(添加觀察者時,預設可以接收該參數)
以上,就是notificationCenter的簡單使用。注意:在不需要監聽時,一定要移除觀察者。
三、block(閉包)
block的簡單使用,仍以監聽按鈕點擊並傳遞一個數組為例:
//1、在BtestView.h檔案中,我們可以提供這樣一個類方法用於初始化:@interface BTestView : UIView/**block屬性*/@property(nonatomic,copy) void(^arrBlock)(NSArray *);/**初始化方法*/+ (instancetype)bTestViewWithArrBlock:(void(^)(NSArray *arr))arrBlock;@end//2、在BTestView.m檔案中,實現該方法:+ (instancetype)bTestViewWithaArrBlock:(void(^)(NSArray *arr))arrBlock { BTestView *view = [[BTestView alloc] init]; _arrBlock = arrBlock; return view;}//3、在Button的addTarge點擊事件中調用arrBlock- (void)clickBtn { NSArray *arr = @[@"test", @"notificationCenter"]; _arrBlock(arr); }
在NTestViewController中使用block:
- (void)viewDidLoad { [super viewDidLoad]; BTestView *view = [BTestView bTestViewWithArrBlock:^(NSArray *arr){ NSLog(@"%@", arr); }]; [self.view addSubview:view]; }
不知道大家看到block用法的時候有沒有一種熟悉感?
注意:block屬性要用copy修飾,同時,在使用的時候要注意不要造成循環參考。
至於這三種通訊方式具體要用哪一種?這必須結合實際項目才能做出選擇,常見的一種說法是:一對多通訊用notificationCenter,一對一通訊在方法少的情況用block,方法多的情況用delegate。
注意:以上代碼均未通過實際測試,本文僅提供簡單的使用思路。