iOS分享,ios分享功能

來源:互聯網
上載者:User

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。

  注意:以上代碼均未通過實際測試,本文僅提供簡單的使用思路。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.