实验说明

(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

利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值的更多相关文章

  1. iOS开发UINavigation——导航控制器UINavigationController

    iOS开发UINavigation系列一——导航栏UINavigtionBar摘要iOS中的导航条可以附着于导航控制器之中使用,也可以在controller中单独使用,这篇博客,主要讨论有关导航栏的使 ...

  2. [BS-20] 导航控制器和视图控制器在添加控制器的区别

    导航控制器和视图控制器在添加控制器的区别 1. 因导航控制器拥有导航栈,有一个普通视图控制器都没有的数组viewControllers,加入该数组中的视图控制器默认以push的方式进入导航栈.导航控制 ...

  3. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  4. Asp.Net Core MVC控制器和视图之间传值

    一.Core MVC中控制器和视图之间传值方式和Asp.Net中非常类似 1.弱类型数据:ViewData,ViewBag 2.强类型数据:@model 二.代码 实例  1.ViewData pub ...

  5. 导航控制器(UINavigationController)

    导航控制器管理一系列显示层次型信息的场景.它创建一个视图管理器"栈",栈底为根视图控制器,用户在场景间切换时,依次将试图控制器压入栈中,且当前场景的试图控制器位于栈顶.要返回上一级 ...

  6. UINavigationController 导航控制器 ,根据文档写的一些东西

    今天讲了导航控制器UINavigationController 和标签栏视图控制器UITabBarController 先来说一说导航视图控制器  UINavigationController 导航控 ...

  7. IOS开发-表视图LV3导航控制器

    学到这里感觉有点难了,其实这篇文章再草稿箱里放了好久了~ 最近对于学习的热情下降了.这不行-抓紧学习走起! 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用, 首先要了解一些概念-- 1 ...

  8. IOS 导航控制器基本使用(UINavigationController代码创建方式)

    ● UINavigationController的使用步骤 ➢ 初始化UINavigationController ➢ 设置UIWindow的rootViewController为UINavigati ...

  9. IOS UINavigationController 导航控制器

    /** 导航控制器掌握: 1.创建导航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootVie ...

随机推荐

  1. pack布局

    Chapter 2. Geometry Management 第2章 布局管理: 显示部件在屏幕上,他们必须被传递给布局管理器. 布局管理器 控制部件的位置和大小 在显示窗口,几个布局管理器是可用的在 ...

  2. win7系统怎样备份

    利用系统自带的备份还原 1 这种方法的缺点是如果以后系统出现问题,无法进入系统的话,就无法恢复系统了.首先我们点击开始菜单,打开控制面板! 2 在控制面板中点击系统和安全! 3 我们选择备份和还原中的 ...

  3. adobe reader安装完成之前被中断,错误代码150210解决方法

    adobe reader安装完成之前被中断,错误代码150210解决方法出现这种情况是因为之前安装过adobe reader但是没有卸载删除干净进而导致重新安装时无法安装.为什么卸载不了大多数是因为3 ...

  4. web站点监控脚本web_status_code,tomcat 80,oracle1521

    1,完整的监控脚本如下 #!/bin/bash #web_status_code=`curl -o /dev/null -s -w "http_code:%{http_code}" ...

  5. Linux磁盘及文件系统管理 3---- 文件系统

    1 文件系统 1 操作系统通过文件系统来管理文件及数据,磁盘或分区需要创建文件系统之后才能为操作系统使用,创建文件系统的过程称为格式化 2 没有文件系统的设备称为裸设备 3 常见的文件系统有fat32 ...

  6. Android的读写文件权限

    设置文件生成的权限: public static boolean saveInfo( Context context, String userName, String userPass, int mo ...

  7. 下载类网站的SEO优化方面技巧

    在互联网国际中有一类十分主要的网站,那即是供应各种软件下载的网站,这类网站可以协助用户解决许多软件运用方面的疑问,可是随着知识产权维护的认识越来越强,许多下载类网站也要开端改动自个的经营策略,这么才可 ...

  8. hibernate 查询、二级缓存、连接池

    hibernate 查询.二级缓存.连接池 查询: 1) 主键查询 Dept dept =  (Dept) session.get(Dept.class, 12); Dept dept =  (Dep ...

  9. Connect the Cities(prime)

    Connect the Cities Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  10. NPOI导出为Excel文件

    1.添加引用 2.将ExcelRender.cs和SqlHelper.cs两个类拷贝到App_Code文件夹下 3.写后台代码 eg:根据部门和日期导出成绩表 /// <summary> ...