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


之前對於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了。

附上模擬器的效果圖:

最后附上demo的git地址:點擊跳轉

不喜勿噴,歡迎討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM