iOS通過代理逆向傳值的方式詳解
前言
在iOS開發(fā)中,常見的幾種逆向傳值方式,有代理(delegate)、通知(NSNotification),block等等,本文就給大家分析下,如何理解和快速上手代理模式,并以一個簡單的逆向傳值為案例,看看代理模式是不是很難。
一、代理模式中的幾個概念
講代理模式之前,首先需要弄清楚兩個概念:被代理對象和代理對象。并且需要知道它們之間是靠協(xié)議關(guān)連起來的。
1、被代理對象
被代理對象往往就是真正有做事意圖的那個對象,比如賣房子案例中的想賣房子的房主,保姆嬰兒案例中想喝奶的嬰兒。但是它們自己做不到,只能借助于房產(chǎn)中介和保姆。
2、代理對象
代理對象就是真正辦事的對象,如上面提到的幫賣房子的中介和照顧嬰兒的保姆。
3、協(xié)議
代理對象必須有一個規(guī)范才能成為代理,比如說只有持證的才能成為房產(chǎn)中介,房主才敢把房子交給他代理,只有家政服務(wù)的保姆才敢讓她過來照顧嬰兒,不可能讓保姆去賣房子,讓中介照顧嬰兒。而這個規(guī)范就是協(xié)議,這個協(xié)議誰定的?答案肯定是被代理對象。
二、代理模式的書寫規(guī)范
弄清楚基本概念以后,接下來就是書寫代理模式,很多同學(xué)不知道怎么下手,其實(shí)這也是有跡可循的。
被代理對象
1、定義協(xié)議,在協(xié)議中定義方法用于傳值,傳什么類型的值就設(shè)置什么類型的參數(shù)
2、聲明一個遵守上述協(xié)議的delegate屬性
3、在需要傳值的時候調(diào)用代理對象完成傳值
代理對象
1、遵守被代理對象定義的協(xié)議
2、實(shí)現(xiàn)協(xié)議中的方法,捕獲傳過來的值,并根據(jù)需求來處理捕獲的值
設(shè)置被代理對象的delegate屬性為代理對象
這一步是在上述兩個對象的其中一個里面完成的
三、代理模式與逆向傳值
通過如上描述可以看出,其實(shí)代理模式只是一種解決特定問題的方法,它有自己的使用場景,比如A想監(jiān)聽B的一些變化,A無法自己處理某些事情等。俗話說No Code, No BB,下面舉一個實(shí)際案例:現(xiàn)在有兩個界面,如圖1和圖2所示,界面很簡單,不再贅述,主要是在第一個界面點(diǎn)擊跳轉(zhuǎn)按鈕,到達(dá)第二個界面,然后第二界面在輸入框中輸入信息后點(diǎn)擊返回按鈕,第一個界面中的UILabel能顯示第二個界面輸入的內(nèi)容,這是最簡單的一個逆向傳值。
四、實(shí)現(xiàn)步驟
分析: 現(xiàn)在是第二個界面想傳值,但是自己做不了,所以它是被代理對象,第一個界面自然就是代理對象。然后根據(jù)上面的規(guī)范寫代碼。
1、被代理對象
//.h 文件 //被代理對象 做以下幾件事 //1、創(chuàng)建一個協(xié)議,用于傳值 //2、聲明一個遵守上述協(xié)議的delegate屬性 /** * 創(chuàng)建協(xié)議,里面有一個方法,帶一個參數(shù),該參數(shù)就是我想傳出去的值 */ @protocol passValue <NSObject> -(void)passedValue:(NSString *)inputValue; @end @interface NextViewController : UIViewController /** * 聲明一個delegate屬性 */ @property(nonatomic, weak) id<passValue> delegate; @end ================================================================= //.m 文件 #import "NextViewController.h" @interface NextViewController () @property (weak, nonatomic) IBOutlet UITextField *inputText; - (IBAction)back:(id)sender; @end @implementation NextViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"第二個界面"; } /** * 返回上一個界面 * * @param sender <#sender description#> */ - (IBAction)back:(id)sender { NSString *inputString = self.inputText.text; //3、調(diào)用代理對象完成傳值 if(self.delegate && [self.delegate respondsToSelector:@selector(passedValue:)]){ [self.delegate passedValue:inputString]; } [self.navigationController popViewControllerAnimated:YES]; } @end
2、代理對象
//.h 文件 #import <UIKit/UIKit.h> #import "NextViewController.h" //代理對象 //實(shí)現(xiàn)被代理對象創(chuàng)建的協(xié)議,實(shí)現(xiàn)其中的方法,捕獲傳過來的值 @interface ViewController : UIViewController <passValue> @end ================================================================= //.m 文件 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *nextPassedValue; - (IBAction)next:(id)sender; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } /** * 實(shí)現(xiàn)被代理對象的方法,將捕獲的值設(shè)置到UILabel中 * * @param inputValue 傳過來的值 */ -(void)passedValue:(NSString *)inputValue{ self.nextPassedValue.text = inputValue; } //點(diǎn)擊返回按鈕跳轉(zhuǎn)到第二個界面 - (IBAction)next:(id)sender { NextViewController *nvc = [[NextViewController alloc]init]; //設(shè)置被代理對象的delegate屬性為代理對象即self nvc.delegate = self; [self.navigationController pushViewController:nvc animated:YES]; } @end
五、實(shí)現(xiàn)效果
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對各位iOS開發(fā)者們能有所幫助,如果有疑問大家可以留言交流。
相關(guān)文章
ios開發(fā)UITableViewCell圖片加載優(yōu)化詳解
這篇文章主要為大家介紹了ios開發(fā)UITableViewCell圖片加載優(yōu)化的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07iOS開發(fā)-自定義相機(jī)實(shí)例(仿微信)
這篇文章主要介紹了iOS開發(fā)-自定義相機(jī)實(shí)例(仿微信),實(shí)例分析了ios 自定義相機(jī)的技巧,非常具有實(shí)用價值,需要的朋友可以參考下。2017-03-03學(xué)習(xí)iOS開關(guān)按鈕UISwitch控件
這篇文章主要為大家詳細(xì)介紹了iOS開關(guān)按鈕UISwitch控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08iOS13即將到來,iOS推送DeviceToken適配方案詳解
這篇文章主要介紹了iOS13即將到來,iOS推送DeviceToken適配方案詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09