題記: 做ios好幾年了,剛畢業出來的時候,對於ios的代理方法怎麼都理解不了。但是也會去用。只是不理解,工作了幾年之後,再回頭去看當前所難以理解的事情也已經不是多麼的難以理解了。因此接下吧把自己對於代理的一些理解寫出來分享一下。
當對象A想做某件事時,他無能爲力去做。或者說他不想去做。那麼他就需要尋找一個代理去幫他做。很顯然。代理的作用就是代替A去做某件事。代理跟我們日常生活中的代理意思是一樣的。例如小明想去打官司。但是他不懂法律,並且自己口才不好。所以他只能請一個代理律師去。這個代理律師的作用就是代替自己去打官司。在舉個例子。小強現在在玩遊戲。玩的很聚精會神,但是他現在餓了。又不想去食堂吃飯。那麼他又一個辦法,就是叫外賣。那麼現在這個送外賣的就是小強的代理。他幫助小強做了他想做卻不能做,或懶的做的事情。
理解的上述概念就好辦了。接下來我們把我們日常生活中的經驗應用到我們的代碼中去。
1、現在我自定義一個view對象。對象名叫myView的傢伙。間稱A。並且在A中創建一個按鈕。實現該按鈕的點擊方法。
實現代碼如下:
#import "myView.h"
@interface myView()
@property(nonatomic,strong)UIButton *button;
@end
@implementation myView
-(instancetype)initWithFrame:(CGRect)frame{
if (self=[super initWithFrame:frame]) {
[self initView];
}
return self;
}
-(void)initView{
_button =[UIButton buttonWithType:UIButtonTypeCustom];
[_button setTitle:@"變色" forState:UIControlStateNormal];
[_button setBackgroundColor:[UIColor blackColor]];
[_button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[_button addTarget:self action:@selector(changeBackgroundColor) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:_button];
}
-(void)changeBackgroundColor{
}
2、把這個對象A放到一個控制器UIViewController上面展示出來。我們簡稱這個控制器爲對象B
myView *view=[[myView alloc]initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 50)];
[self.view addSubview:view];
3、現在我想做一件事情。就是用對象A去控制對象B的背景顏色。怎麼去做呢。顯然A是一個對象、B另外一個對象。A對象myView。B對象是控制器。A現在想做一件事情就是想控制B的顏色。這件事顯然A做不到。因爲控制B的顏色只有他自己才能辦到。那麼A想做這件事怎麼辦呢。他就需要跟B先達成一個協議。這個協議的目的就是讓B同意並認同A的做法。A如何與B達成協議呢,第一步自己先制定一個協議。制定協議的方法如下。
#import <UIKit/UIKit.h>
@protocol buttonClickDelegate<NSObject>
-(void)buttonClick;
@end
@interface myView : UIView
@property(nonatomic,weak) id <buttonClickDelegate> delegate;
@end
A想控制B,想讓B幫他做控制自己顏色變化這件事。B必須同意A的協議。
@interface ViewController ()<buttonClickDelegate>
view.delegate=self;
此時A的協議已經寫好。B也認同的A的協議。那麼A與B之間就達成了一種委託人與代理人的關係。委託人是A。因爲A想讓B幫他辦事,委託人當然是A。代理人是B。此時B就是A的代理了。也就是UIViewController已經是myView這個對象的代理的。
4、開始做A想做的事情。A想做一件事情肯定要有一個觸發操作。A什麼時候讓B變色。我們現在把點擊按鈕作爲觸發操作。當A點擊自己的按鈕時候開始讓B爲自己做事情(變色)。這時候就該在點擊按鈕的方法中實現。先判斷代理是否能響應協議中的方法。如果能響應。就讓代理去執行協議方法。測試的代理人是B。所self.delegate就是B對象
-(void)changeBackgroundColor{
if ([self.delegate respondsToSelector:@selector(buttonClick)]) {
[self.delegate buttonClick];
}
}
5、在對象B中實現操作控制的方法
-(void)buttonClick{
self.view.backgroundColor=[self randomColor];
}
這樣A就完全實現了,控制B的方法了。也就是A完全僱傭了B去爲自己做事情。B完全成爲了A的代理了。A就可以做自己想做的事了。
點擊變色B就變色了。以上就是我對代理的一些理解。如果您有更好的意見或建議歡迎留言我們探討。