協議和代理
IOS中協議和代理是很常見的,可是確定有不少人看他感受挺麻煩的,因此就不想去碰他,不過,你要知道協議和代理會解決一些ios沒法解決的問題(論其重要性)。
什麼是協議和代理
簡單一點來講就是頁面之間的傳值,當頁面A跳轉到頁面B(可能會附帶參數,這不影響),或者是頁面B將數據返回給頁面A.【代理模式(協議和代理者)是一種設計
模式,原理是經過一個統一的模式,也能夠理解爲裝在一個盒子裏面。協議定義一組方法,由某一個類負責實現;代理者做爲某個類的一個屬性,一般是另外一個類的實例
對象、能夠負責完成原來那個類很差解決的問題】。代理自己就是一個屬性而已,代理的使用每每配合着協議。可能這個類那個類把大家都弄糊塗了,那麼咱們下面就來看看咱們如何去使用他,這也是方便咱們去了解這個模式的真正用途。
如何使用代理
在這裏必需要提一下,咱們在練習的時候怎麼去用他都沒事,要是在真正項目中,兩個頁面簡單跳轉傳值也用這個代理,說實話,確實有點過了。在頁面B中定義
個協議,聲明ー個代理對象。在頁面A中,將本身設置爲頁面B的代理而且完成代理方法。
何時使用代理
當一個對象沒法直接獲取到另外一個對象的指針,但願對那個變量進行一些操做,即可使用代理模式。
話很少說,直接看事例:
eg:tableView上Switch,在點擊Switch獲取Switch的BOOL值。ios
TableViewCell.h:測試
#import <UIKit/UIKit.h> //新建一個協議,協議的名字通常是由「類名+Delegate」 @protocol ViewControllerDelegate <NSObject> //代理傳值方法 -(void)getSwitchIndex:(int)index AndSwitchIsOpen:(BOOL)isOpen; @end @interface TableViewCell : UITableViewCell //委託代理人,代理通常須要使用弱引用(weak) @property (weak,nonatomic) id<ViewControllerDelegate>delagate; @property (strong,nonatomic) UIImageView *IconImage; @property (strong,nonatomic) UILabel *nameLab; @property (strong,nonatomic) UILabel *newsInfoLab; @property (strong,nonatomic) UISwitch *switchs; @property int num; @end
TableViewCell.m:atom
#import "TableViewCell.h" #define ScreenWidth [[UIScreen mainScreen] bounds].size.width @implementation TableViewCell - (void)awakeFromNib { [super awakeFromNib]; UIFont *newFont = [UIFont fontWithName:@"Arial" size:16.0]; UIFont *newFonts = [UIFont fontWithName:@"Arial" size:14.0]; _IconImage = [[UIImageView alloc]initWithFrame:CGMakeRects(12, 6, 40, 40)]; _IconImage.layer.masksToBounds = YES; _IconImage.layer.cornerRadius = _IconImage.frame.size.height/2; [self addSubview:_IconImage]; _nameLab = [[UILabel alloc]initWithFrame:CGMakeRects(65, 5, 100, 20)]; _nameLab.font = newFont; [self addSubview:_nameLab]; _newsInfoLab = [[UILabel alloc]initWithFrame:CGMakeRects(65, 28, 200, 20)]; _newsInfoLab.font = newFonts; _newsInfoLab.textColor = [UIColor grayColor]; [self addSubview:_newsInfoLab]; _switchs = [[UISwitch alloc]initWithFrame:CGMakeRects(250, 5, 50, 20)]; [_switchs addTarget:self action:@selector(Get_Switch_Action) forControlEvents:UIControlEventValueChanged]; [self addSubview:_switchs]; } -(void)Get_Switch_Action{ //通知執行協議方法 [self.delagate getSwitchIndex:_num AndSwitchIsOpen:_switchs.on]; } CG_INLINE CGRect CGMakeRects(CGFloat x,CGFloat y,CGFloat width,CGFloat height){ CGRect rect; float w = ScreenWidth/320; rect = CGRectMake(x * w, y * w, width * w, height * w); return rect; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } @end
ViewController.m:spa
#define TABLEVIEW_LENGTH 3 #define TABLEVIEW_NUM 1 #define TABLEVIEW_CELL_HEIGHT 60 #import "ViewControllerC.h" #import "TableViewCell.h" @interface ViewControllerC ()<UITableViewDelegate,UITableViewDataSource,ViewControllerDelegate> @property (strong,nonatomic) UITableView *tableView; @end @implementation ViewControllerC - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. self.view.backgroundColor = [UIColor colorWithRed:232/255.0 green:232/255.0 blue:232/255.0 alpha:1.0]; _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height)]; _tableView.delegate = self; _tableView.dataSource = self; [self.view addSubview:_tableView]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return TABLEVIEW_LENGTH; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return TABLEVIEW_NUM; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return TABLEVIEW_CELL_HEIGHT; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *resusedefier = @"CELL"; UINib *nib = [UINib nibWithNibName:@"TableViewCell" bundle:nil]; [tableView registerNib:nib forCellReuseIdentifier:resusedefier]; TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:resusedefier]; if (cell == nil) { cell = [[TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:resusedefier]; } cell.delagate = self; cell.IconImage.image = [UIImage imageNamed:@"0"]; if (indexPath.section == 0) { cell.nameLab.text = @"協議代理測試1"; cell.num = 1; }else if (indexPath.section == 1) { cell.nameLab.text = @"協議代理測試2"; cell.num = 2; }else if (indexPath.section == 2) { cell.nameLab.text = @"協議代理測試3"; cell.num = 3; } cell.newsInfoLab.text = @"獲取cell上Switch的值"; return cell; } - (void)getSwitchIndex:(int)index AndSwitchIsOpen:(BOOL)isOpen{ if (index == 1) { NSLog(@"Switch1--%@",isOpen?@"YES":@"NO"); }else if (index == 2){ NSLog(@"Switch2--%@",isOpen?@"YES":@"NO"); }else{ NSLog(@"Switch3--%@",isOpen?@"YES":@"NO"); } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }
看看效果圖吧:設計
打印結果:代理
以上就是簡單自定義協議代理的例子。指針
-----輝小魚code