【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
来源:互联网 发布:加工中心手动编程自学 编辑:程序博客网 时间:2024/05/13 07:46
实验说明
(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
实验结果截个图
- 【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
- 【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
- iOS开发利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
- iOS开发 — (UINaVigationController)导航控制器,界面传值
- 我的iOS学习历程 - 导航控制器(UINavigationController) + 界面之间的传值
- 【iOS开发-24】导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果
- iOS开发导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果
- iOS基础控件-UINavigationController 中的传值,代理传值,正向传值,反向传值
- iOS详细解析视图控制器的正向和逆向传值
- ios中控制器之间的反向传值之二---代理传值
- ios 导航控制器UInavigationController跳转以及返回传值
- ios中控制器之间的反向传值之---Block
- UINavigationController中的传值实例,正向传值,反向传值,单例传值,代理传值,代理回调
- 【iOS开发-21】UINavigationController导航控制器初始化,导航控制器栈的push和pop跳转理解
- iOS开发UINavigationController导航控制器初始化,导航控制器栈的push和pop跳转理解
- iOS开发-21UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解
- iOS开发-21UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解
- iOS开发:UINavigationController导航控制器
- Web.xml配置详解之listener
- 编码转换工具网址
- Shell编程极简入门实践
- 豆瓣获取电影信息
- mysql数据库中添加新的字段
- 【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
- 字符编码
- hdu 5147 树状数组
- 对枚举值(Enum)进行位操作(AND & OR)
- Android Activity和Intent机制学习笔记
- MVC中的分部视图
- java类加载器
- 正则表达式
- android动画(一)Interpolator