利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...
實驗說明
(1)正向傳值:比如A類里地值要傳給B類用,就是我們先在A類中聲明一個B類對象(當然B類頭文件要import過來),然后把A類中得某個 值傳遞給B類中得某個值(所以需要在B類中先準備一個變量來接受,就是用@property和@synthesize整個變量即可)。
(2)反向傳值:比如需要把B類中的值傳遞給A類用。我們先在B類中寫一個協議,協議里面有一個可以帶參數的方法,這個參數就是我們要傳遞的值 (這個協議也可以單獨寫,不一定寫在B類中),然后B類遵循這個協議后,利用這個協議創建一個委托變量,再把這個委托變量指定給A類,然后在A類中實現協 議里面的方法。
(3)當然精彩之處在于:
- B類雖然遵守了協議但是不實現協議里的方法,只是給這個方法傳遞一個值,然后讓A類去實現這個方法,當然與此同時A類會接受到B類給這個方法傳遞的值,而這個值就是我們需要傳遞的值,所以就實現了值得傳遞。
- 巧妙利用委托變量,先是在B類中用這個委托變量給方法傳遞了一個值,然后在A類中把這個委托變量給A類,所以A類在實現協議方法的時候其實就獲得了之前B類利用委托變量傳遞的那個值。
參考資料
(1)關于為什么在ViewController.m中有sec1.delegate1=self,如果不明白參考 xxxx.delagate=self;
(2)關于委托變量,如果不明白可以參考 Objective-C 協議 簡介 +委托的實現 和?iOS中的協議與委托
(3)關于整個委托代理傳值的模式,如果不明白,可以參考
iOS開發之協議:代理傳值
實驗目的
(1)實現反向傳值:從ViewController點擊進入SecondViewController(有三個按鈕),再點擊任意一個按鈕,返回ViewController并把這個按鈕的title變成導航條上的title。然后
(2)實現正向傳值:我們再點擊進入SecondViewController把和導航條上title相同的按鈕的文字顏色變成紅色(也就是之前三個按鈕中被點擊的那個)。
所以,我們需要的是一個導航控制器,并且里面有兩個視圖控制器ViewController和 SecondViewController,ViewController是根視圖控制器。當然我們需要在AppDelegate.m中初始化導航控制器 并把ViewController設置為根視圖控制器,并把self.window.rootViewController設置為這個導航控制器,這樣導 航控制器才能顯示出來。在此處這部分代碼略去。我們主要看兩個視圖控制器里面的代碼。
實驗代碼
在SecondViewController.h中:
#import <UIKit/UIKit.h> //創建一個協議,傳遞值的協議 @protocol sendValue <NSObject> -(void)sendBtnTitle:(NSString *)btnTitle; @end //讓這個SecondViewController類遵守這個協議 @interface SecondViewController : UIViewController<sendValue> //利用這個協議,創建一個委托變量,類對象可以利用這個委托變量來調用協議中的方法,類似于一個屬性,如本例SecondViewController.m中得[self.delegate1 sendBtnTitle:text1]; //這個委托變量設置成哪個類,就相當于哪個類變成代理,因為人家都把委托給你了,那么你能不是代理嗎?如本例ViewController.m中的sec1.delegate1=self @property(nonatomic,assign) id <sendValue> delegate1; @property(nonatomic,assign) NSString *titleText; @end在SecondViewController.m中:
#import "SecondViewController.h"@interface SecondViewController ()@end @implementation SecondViewController @synthesize delegate1; @synthesize titleText; - (void)viewDidLoad { //利用for創建三個按鈕并分別弄個title,分別添加個點擊事件,并在這里面弄個if判斷,如果ViewController頁面傳遞過來的titleText值和哪個按鈕的title值一致,那么這個按鈕的title就變成紅色 for (int i=1; i<=3; i++) { UIButton *btn=[[UIButton alloc]init]; btn.frame=CGRectMake(38, 60+40*i, 300, 30); btn.backgroundColor=[UIColor purpleColor]; [btn setTitle:[NSString stringWithFormat:@"按鈕%i",i] forState:UIControlStateNormal]; if ([titleText isEqualToString:btn.currentTitle]) { btn.selected=YES; } [btn setTitleColor:[UIColor redColor] forState:UIControlStateSelected]; [btn addTarget:self action:@selector(backTo:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; } [super viewDidLoad]; // Do any additional setup after loading the view. } //因為我們需要獲得當前按鈕的title,所以需要把按鈕對象傳遞過來,增加了一個參數 -(void) backTo:(UIButton *)btn { //利用currentTitle屬性獲取當前按鈕的title NSString *text1=btn.currentTitle; //利用委托變量來給協議里面的方法發送一個消息,讓其去執行,但是這個執行我們是在ViewController.m中去實現的,這里其實相當于通知方法去啟動的感覺 [self.delegate1 sendBtnTitle:text1]; [self.navigationController popViewControllerAnimated:NO]; } @end在ViewController.h中:
#import <UIKit/UIKit.h> #import "SecondViewController.h" //遵循<sendValue>協議 @interface ViewController : UIViewController<sendValue> @end在ViewController.m中:
#import "ViewController.h" #import "SecondViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { //增加一個按鈕,它點擊可進入SecondViewController的視圖里 UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect]; btn1.frame=CGRectMake(38, 80, 300, 30); btn1.backgroundColor=[UIColor whiteColor]; [self.view addSubview:btn1]; [btn1 setTitle:@"JUMP TO SECONDVIEWCONTROLLER" forState:UIControlStateNormal]; [btn1 addTarget:self action:@selector(jumpTo:) forControlEvents:UIControlEventTouchUpInside]; [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } -(void)jumpTo:(NSString *)barTitle{ //先初始化一個對象,因為下面要把這個對象中得委托變量給我們當前的類 SecondViewController *sec1=[[SecondViewController alloc]init]; //這個是關鍵,需要把之前的委托變量給當前的類(即ViewController視圖控制器),既然接受委托成為代理了,那么就要實現協議里地方法,因為這個方法在SecondViewController里沒有實現,它找了ViewController做代理幫它實現,其實就是利用這個方法來傳值,當然這個方法需要有參數,不然傳個屁值 sec1.delegate1=self; //把當前導航條的title傳遞給SecondViewController的一個變量,是正向傳值 sec1.titleText=self.navigationItem.title; [self.navigationController pushViewController:sec1 animated:NO]; } //反向傳值:把協議方法傳遞過來的值賦值給我們當前導航條的title -(void)sendBtnTitle:(NSString *)btnTitle{ self.navigationItem.title=btnTitle; } @end轉載于:https://www.cnblogs.com/Free-Thinker/p/5011004.html
總結
以上是生活随笔為你收集整理的利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6 Promise 并行执行和顺序执
- 下一篇: 淘宝首页的HTML以及CSS技术点