免費開源的iOS開發學習平臺

                                                OC基礎:代理協議(Delegate)

                                                在iOS開發中,經常使用到代理(委托)協議以及數據源協議,所謂代理(委托)協議,通俗來講,顧名思義就是委托別人辦事,就是當一件事情發生后,自己不處理,讓別人來處理。例如,用戶點擊了一個子控件上的按鈕,這時可以委托控制器去做一些事情,例如切換到另外的控制器或者發送一個網絡請求等。代理協議也是協議,因此實現自定義代理協議的方法與協議的實現,基本一致。

                                                代理協議的實現

                                                下方的示例代碼中實現了在一個UIView的視圖類中實現代理協議,并添加一個代理協議方法,當用戶發生點擊操作時會執行遵守代理協議對象中實現的協議方法。

                                                • 在自定義視圖類MYView.h文件中:設置類引用@class、定義代理協議名稱、定義代理協議中包含的方法、添加代理屬性(注意使用weak屬性); (注意:協議中的方法,一般情況下(不強制),通常第一個參數都是對象自身,這樣做的好處在于:在遵守協議的類中,實現協議中的方法時,可以獲取到一些有用信息。)
                                                #import <UIKit/UIKit.h>
                                                @class MYView;
                                                @protocol MyViewDelegate <NSObject>
                                                -(void) myView:(MYView *) myView clickMYButtonShowAlert:(NSString *) message;
                                                @end 
                                                @interface MYView : UIView
                                                @property (nonatomic, weak) id <MyViewDelegate> delegate; 
                                                @end
                                                
                                                • 在MYView.m文件中,監聽代理協議定義事件的發生,當事件發生時,通知遵守代理協議的對象(如控制器)去工作,即設置在實現代理協議的類中,代理協議方法執行的時機;(注意:我們在通知遵守代理協議的對象(self.delegate)在調用協議方法之前,通常會先判斷一下該對象中,是否已經實現了該協議方法,即是否響應代理協議方法對應的消息,使用respondsToSelector:方法。)
                                                -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
                                                    if ([self.delegate respondsToSelector:@selector(myView:clickMYButtonShowAlert:)]) {
                                                        [self.delegate myView:self clickMYButtonShowAlert:@"視圖被點擊了"];
                                                    }
                                                }
                                                
                                                • 在需要遵守代理協議的類中,引用頭文件并遵守代理協議,遵守代理協議需要在類的接口部分使用<>符號來聲明該類需要遵守的協議,同一個類可以遵守多個協議
                                                #import "MYView.h"
                                                @interface ViewController () <MyViewDelegate>
                                                @property (nonatomic,strong) MYView *myView;
                                                @end
                                                
                                                • 設置代理對象。
                                                -(MYView *)myView{
                                                    if (_myView == nil) {
                                                        _myView = [[MYView alloc] init];
                                                        _myView.frame = CGRectMake(0, 500, 320, 50);
                                                        _myView.backgroundColor = [UIColor yellowColor];
                                                        _myView.delegate = self;//設置代理對象
                                                    }
                                                    return _myView;
                                                }
                                                
                                                - (void)viewDidLoad {
                                                    [super viewDidLoad];
                                                    [self.view addSubview:self.myView];
                                                }
                                                
                                                • 實現協議方法。即當觸發條件發生時,執行的動作。
                                                -(void)myView:(MYView *)myView clickMYButtonShowAlert:(NSString *)message{
                                                    NSLog(@"%s",__func__);
                                                    NSLog(@"傳遞的消息是:%@",message);
                                                }
                                                

                                                運行結果如下。當我們點擊屏幕上面紅色的視圖對象時,會打印如下的日志,通過日志我們可以看到,當點擊視圖對象時,調用的是控制器類中實現的代理協議,同時,視圖對象可以傳遞信息(message)給控制器對象,從而實現了對象之間的通信。

                                                示例代碼

                                                https://github.com/99ios/5.3.2


                                                欧美超级精品一级A片|欧美一级黄色视频|国产精品自在在线午夜免费|4444亚洲人成无码网在线观看|亚洲ⅴa曰本va欧美va视频