iOS 中delegate的理解與使用(傳值)

之前做了半年的iOS,剛入了門,又被拉去轉戰java,現在iOS的那位大佬離職了,又被弄過來維護app,之前對於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了。

附上模擬器的效果圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章