国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS通過代理逆向傳值的方式詳解

2020-07-26 03:03:10
字體:
來源:轉載
供稿:網友

前言

在iOS開發中,常見的幾種逆向傳值方式,有代理(delegate)、通知(NSNotification),block等等,本文就給大家分析下,如何理解和快速上手代理模式,并以一個簡單的逆向傳值為案例,看看代理模式是不是很難。

一、代理模式中的幾個概念

講代理模式之前,首先需要弄清楚兩個概念:被代理對象和代理對象。并且需要知道它們之間是靠協議關連起來的。

1、被代理對象

被代理對象往往就是真正有做事意圖的那個對象,比如賣房子案例中的想賣房子的房主,保姆嬰兒案例中想喝奶的嬰兒。但是它們自己做不到,只能借助于房產中介和保姆。

2、代理對象

代理對象就是真正辦事的對象,如上面提到的幫賣房子的中介和照顧嬰兒的保姆。

3、協議

代理對象必須有一個規范才能成為代理,比如說只有持證的才能成為房產中介,房主才敢把房子交給他代理,只有家政服務的保姆才敢讓她過來照顧嬰兒,不可能讓保姆去賣房子,讓中介照顧嬰兒。而這個規范就是協議,這個協議誰定的?答案肯定是被代理對象。

二、代理模式的書寫規范

弄清楚基本概念以后,接下來就是書寫代理模式,很多同學不知道怎么下手,其實這也是有跡可循的。

被代理對象

1、定義協議,在協議中定義方法用于傳值,傳什么類型的值就設置什么類型的參數

2、聲明一個遵守上述協議的delegate屬性

3、在需要傳值的時候調用代理對象完成傳值

代理對象

1、遵守被代理對象定義的協議

2、實現協議中的方法,捕獲傳過來的值,并根據需求來處理捕獲的值

設置被代理對象的delegate屬性為代理對象

這一步是在上述兩個對象的其中一個里面完成的

三、代理模式與逆向傳值

通過如上描述可以看出,其實代理模式只是一種解決特定問題的方法,它有自己的使用場景,比如A想監聽B的一些變化,A無法自己處理某些事情等。俗話說No Code, No BB,下面舉一個實際案例:現在有兩個界面,如圖1和圖2所示,界面很簡單,不再贅述,主要是在第一個界面點擊跳轉按鈕,到達第二個界面,然后第二界面在輸入框中輸入信息后點擊返回按鈕,第一個界面中的UILabel能顯示第二個界面輸入的內容,這是最簡單的一個逆向傳值。

四、實現步驟

分析: 現在是第二個界面想傳值,但是自己做不了,所以它是被代理對象,第一個界面自然就是代理對象。然后根據上面的規范寫代碼。

1、被代理對象

//.h 文件//被代理對象 做以下幾件事//1、創建一個協議,用于傳值//2、聲明一個遵守上述協議的delegate屬性/** * 創建協議,里面有一個方法,帶一個參數,該參數就是我想傳出去的值 */@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、調用代理對象完成傳值 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"http://代理對象//實現被代理對象創建的協議,實現其中的方法,捕獲傳過來的值@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]; }/** * 實現被代理對象的方法,將捕獲的值設置到UILabel中 * * @param inputValue 傳過來的值 */-(void)passedValue:(NSString *)inputValue{ self.nextPassedValue.text = inputValue;}//點擊返回按鈕跳轉到第二個界面- (IBAction)next:(id)sender {  NextViewController *nvc = [[NextViewController alloc]init]; //設置被代理對象的delegate屬性為代理對象即self nvc.delegate = self; [self.navigationController pushViewController:nvc animated:YES];}@end

五、實現效果

總結

以上就是這篇文章的全部內容了,希望本文的內容對各位iOS開發者們能有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 廊坊市| 濉溪县| 沅江市| 苏州市| 子洲县| 兰西县| 哈尔滨市| 两当县| 布尔津县| 博爱县| 武强县| 浙江省| 余江县| 日照市| 尤溪县| 务川| 昭苏县| 赤水市| 湘乡市| 北京市| 平武县| 五大连池市| 惠东县| 清流县| 仙游县| 武宁县| 大足县| 肇东市| 尉氏县| 武隆县| 进贤县| 东阳市| 哈尔滨市| 宁晋县| 延川县| 泗阳县| 和顺县| 临沭县| 庆元县| 崇阳县| 天全县|