之前過一遍obj-C基礎的時候,遇到delegate有點看不明白,就先放著了(因為我真不知道用這個delegate可以做什麼)。
首先,講一下,Delegate不是一個屬性或者方法,它是一種「設計模式」。
ios開發練習的時候發現非常頻繁的用到delegate,比如UITableView,就會需要創建一個實例,然後將其delegate屬性設為self.
如果沒有這個設定,後面創建的method都沒有反應….也不知道為甚麼教學要設定protocol然後設定這個delegate屬性。
google上可以找到很多delegate的講解,但是有很多delegate的例子似乎都沒有很好的說明delegate的用處。
注意:我剛開始學習IOS開發沒多久,也都在摸索,由於做記錄還有和別人講述的過程能夠幫助我整理思路,所以我做了這篇關於delegate設計模式的記錄,如果你google到這篇文章,建議跳過,我舉的例子很亂XD。
這邊用一個例子實現Delegate的應用:
實現功能:
- VC1點擊按鈕Button,將value傳送給ChangeText這個Object
- ChangeText將value做了改變,回傳給VC1
- VC1將改變後的Value顯示在Label上。
接下來會創建三個檔案:
1、一個Protocol 用於規定要實現哪些方法的協議。
2、一個UIViewController 用於展現委託的結果。
3、一個NSObject 用於實現被委託方法。
Protocol的代碼:
1 2 3 4 5 6 |
#import <Foundation/Foundation.h> @protocol passTextDelegate <NSObject> @required -(void)DidChangedText:(NSString *)text; @end |
代碼解釋:
protocol規定一定要實現DidChangedText方法
NSObject.h的代碼(ChangeText.h):
1 2 3 4 5 6 7 |
#import <Foundation/Foundation.h> #import "passTextDelegate.h" @interface ChangeText : NSObject -(void)shouldChangeText:(NSString *)text; @property (nonatomic,assign) id<passTextDelegate>delegate; @end |
代碼解釋:
- 設置了用於改變值的方法shouldChangeText
- id<passTextDelegate>delegate,表示設置NSObject的Delegate的對象需要實現<passTextDelegate>中規定的方法
UIViewController.h的代碼(VC1.h):
1 2 3 4 5 6 7 |
#import <UIKit/UIKit.h> #import "passTextDelegate.h" #import "ChangeText.h" @interface VC1 : UIViewController<passTextDelegate>{ UILabel *label; } @end |
代碼解釋:
1、<passTextDelegate>設置protocol,規定一定要實現的方法,這有個好處,比如UITableView有3個一定要實現的方法,不然tableView出不來,這個可以防止你忘記實現方法造成Crash
2、UILabel是為了方便我改變他的值,
NSObject.m的部分(ChangeText.m)
1 2 3 4 5 6 7 8 9 |
#import "ChangeText.h" @implementation ChangeText -(void)shouldChangeText:(NSString *)text{ NSString *str = [NSString stringWithFormat:@"%@ changed!!!",text]; NSLog(@"%@",str); [self.delegate DidChangedText:str]; } |
代碼解釋:
UIViewController會執行[changeText shouldChangeText]方法,這裡收到以後會將改變的值傳送到實現DidChangeText的類。
UIViewController.m主要實現代碼(VC1.m)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
-(void)_initVC{ UIView *baseView = [[UIView alloc]init]; baseView.backgroundColor = [UIColor orangeColor]; self.view = baseView; label = [[UILabel alloc]init]; label.frame = CGRectMake(20,100 , 280, 40); label.layer.borderColor = [[UIColor redColor]CGColor]; label.layer.borderWidth = 2; label.tag = 50; label.text = @"loading...."; [baseView addSubview:label]; UIButton *btn = [[UIButton alloc]init]; btn.frame = CGRectMake(0, 200, 320, 40); btn.backgroundColor = [UIColor blackColor]; [btn addTarget:self action:@selector(btn_touch) forControlEvents:UIControlEventTouchUpInside]; [baseView addSubview:btn]; } -(void)btn_touch{ ChangeText *CT = [[ChangeText alloc]init]; CT.delegate = self; [CT shouldChangeText:@"don"]; } -(void)DidChangedText:(NSString *)text{ label.text = text; } |
代碼解釋:
1、_initVC是我用來初始化的部分,初始化了UIViewController的view。並在baseView上加上了label和button。
2、btn點下後,實例化ChangeText這個NSObject類,將delegate設定為自己(UIViewController),執行ChangeText裡的shouldChangeText方法。
以上只是初學時玩看看protocol+delegate的紀錄,關於Delegate的概念請參考底下網友提供的資料:D