之前對於iOS中的delegate一直都是半知半解,所以剛好趁着這個機會把我所了解的記下來,以便日后查閱。
- delegate的理解
delegate, 也就是代理模式(設計模式的一種),我現在所了解的代理模式是,當我有事要做但是沒空的時候,我就可以請別人幫下忙,我告訴你我要做什么,但是具體怎么做,那是你的事了,就比如說,我想去約個妹紙出來玩,但是自己剛好現在有事不能約,或者自己不好意思約,這時候可以請朋友幫忙約一下,這時朋友就是你的代理(被委托者)了,你就是委托者,你告訴他你的目的是要約妹紙出來玩,約妹紙出來玩也就是你和他之間的協議,至於他怎么把妹紙約出來,你是不用關心的。
delegate最常用的地方就是逆向傳值了(正向傳值直接用屬性傳值就行了)
一般的委托者需要做的事:
1、創建協議(也就是代理要實現的方法)
2、聲明委托變量
3、設置代理(也可以在代理中設置)
4、利用委托變量來調用協議方法(也就是讓代理者開始執行協議)
代理需要做的事:
1、遵循協議
2、實現協議方法
這里有兩個頁面VCA、VCB,我先從VCA Push到VCB,在VCB的一個textfield中輸入我想要傳的值,等點擊按鈕POP回到VCA的時候,把VCB中textfield中的值展示到VCA的label中,這時候VCB就是委托者,VCA就是代理,代碼如下:
1、創建協議
//在VCB中創建協議 //ViewControllerB.h //創建協議 @protocol VcBDelegate <NSObject> - (void)sendValue:(NSString *)value; //聲明協議方法 @end
2、聲明委托變量
//ViewControllerB.h @interface ViewControllerB : UIViewController @property (nonatomic, weak)id<VcBDelegate> delegate; //聲明協議變量 @end
3、設置代理 (我是在VCA按鈕跳轉的時候設置的代理,所以是在VCA.m中設置的)
//ViewControllerA.m - (void)btnClicked { ViewControllerB *vcB = [ViewControllerB new]; vcB.delegate = self; [self.navigationController pushViewController:vcB animated:YES]; }
4、利用委托變量來調用協議方法(也就是讓代理者開始執行協議)
- (void)backActionClicked { //當代理響應sendValue方法時,把_tx.text中的值傳到VCA if ([_delegate respondsToSelector:@selector(sendValue:)]) { [_delegate sendValue:_tx.text]; [self.navigationController popViewControllerAnimated:YES]; } }
5、在代理(ViewControllerA)中遵循協議
//viewControllerA.m @interface ViewControllerA ()<VcBDelegate>//遵循協議 @property (nonatomic, strong) UILabel *recievedLB; @end
6、代理實現協議方法
//ViewControllerA.m //實現協議方法,把接收到的值展示到Label中 - (void)sendValue:(NSString *)value { _recievedLB.text = value; }
這樣就OK了。
附上模擬器的效果圖:
最后附上demo的git地址:點擊跳轉
不喜勿噴,歡迎討論。