利用协议代理实现导航控制器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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle索引自增函数,oracle生成动态前缀且自增号码的函数分享

create or replaceFunction GetInvitationNO(prev varchar2, num1 varchar2, num2 varchar2, sessionSetting varchar2)Return Varchar2Authid Current_User Is PRAGMA AUTONOMOUS_TRANSACTION;-- 需要使用“Current_User”的权限防止无法运行“Execute Immediate”命令 & …

JS字符串转换为JSON的四种方法笔记

1、jQuery插件支持的转换方式&#xff1a;示例&#xff1a;$.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象2、浏览器支持的转换方式(Firefox&#xff0c;chrome&#xff0c;opera&#xff0c;safari&#xff0c;ie)等浏览器&#xff1a;…

iOS Block全面分析

http://my.oschina.net/leejan97/blog/268536 http://blog.csdn.net/enuola/article/details/8674063 注意事项1.内联的block中内部定义的变量 自己本身有读写权限2.block内部要修改外部变量 需要将外部变量声明__block3.Block retain是无效的&#xff0c;要想保留block生命周期…

win7 php redis 扩展,Windows中安装Redis及php redis扩展

Windows10环境安装Redis:1、下载Redis安装包&#xff1b;2、解压到自定义目录&#xff1b;3、windows键R&#xff0c;输入cmd 进入命令行&#xff0c;进入Redis的解压目录&#xff1b;4、运行&#xff1a;redis-server.exe redis.windows.conf 显示如下&#xff0c;说明启动成功…

【原创】MVC+ZTree实现权限树的功能

2、html代码权限树&#xff1a;3、JS代码var setting {async: {enable: true,url: /RoleToPerssion/GetPerssionTree,//异步加载时的请求地址autoParam: ["roleid"],//提交参数type: get,dataType: json},check: {enable: true, //true / false 分别表示 显示 / 不…

集合习题之列出有限集合所有子集

1、题目&#xff08;《离散数学及其应用》第6版P75 20 题&#xff09; 给出可以列出有限集合所有子集的步骤。 2、 解题思路 假设有集合A {a1, a2 … an}&#xff0c;列出其所有子集。 先列出含有1个元素的所有子集&#xff1a;{a1},{a2} … {an}然后列出含有2个元素的所有子…

C# partial 关键字的使用

C# 2.0 引入了局部类型的概念。局部类型允许我们将一个类、结构或接口分成几个部分&#xff0c;分别实现在几个不同的.cs文件中。局部类型适用于以下情况&#xff1a;(1) 类型特别大&#xff0c;不宜放在一个文件中实现。(2) 一个类型中的一部分代码为自动化工具生成的代码&…

oracle中的输入 amp,Oracle之SQL学习

1.Oracle 更改会话(更改oracle中显示日期的方式)SQL> alter session set NLS_date_formatYYYY-MM-DD;2.使用绑定变量来输入记录(可以重复执行&#xff0c;输入记录)&#xff1a;SQL> insert into test1(id,name)2 values(&id, &name);输入 id 的值: 5输入 name…

线段的平移和旋转

//github不会用&#xff0c;试了很久不知道怎么上传代码 #include <iostream> using namespace std;#include <stdlib.h> #include <Eigen/Dense> #include <math.h> using namespace std; using Eigen::MatrixXd; int main() { int option; struct p…

我不问+你不说

阅读原文很多事我不问你不说这就是距离我问了你不说这就是隔阂我问了你说了这就是尊重你想说我想问这就是默契我不问你说了这就是信任很多事情你看到的听到的未必是你想象的那样人生在世多给别人机会解释多些向别人解释的耐心人生会少很多遗憾不问、不说、不解释这不是酷或有个…

怎么安装redhat linux操作系统,红帽RedHat Linux5系统安装指南

介绍如何安装linux操作系统&#xff0c;以目前市场主流的操作系统为例子进行介绍。1、放入安装dvd光盘&#xff0c;然后启动服务器&#xff0c;可得如下画面&#xff1a;2、按enter键&#xff0c;进入如下画面3、选择skip&#xff0c;按enter进入&#xff0c;下面画面&#xff…

Net中的Request和Response对象的理解

Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。Request 对象用于接收客户端浏览器提交的数据&#xff0c;而Response 对象的功能则是将服务器端的数据发送到客户端浏览器。一、Request对象的五个集合&#xff1a;QueryString&#xff1a;用以获取客户端附在…

研华工控机u盘启动安装linux系统,研华工控机怎么设置u盘启动

本文主要介绍研华IPC如何设置u盘启动研华IPC-610 IPC随XP版一起安装。有时安装控制软件需要在不满意时卸载。卸载未完成&#xff0c;这使得安装无法进行&#xff0c;因此您需要将系统恢复到相对纯粹的时间。通常&#xff0c;USB磁盘启动盘的安装系统首先备份初始纯XP作为备份&a…

UVA - 11732 strcmp() Anyone?左兄弟右儿子trie

input n 2<n<4000 s1 s2 ... sn 1<len(si)<1000 output 输出用strcmp()两两比较si,sj(i!j)要比较的次数&#xff0c;结果在long long范围内&#xff08;相同字符比较两次&#xff0c;不相同字符比较一次&#xff0c;包括\0&#xff09; 做法&#xff1a;由于字符集…

防止SQL注入式攻击的笔记

SQL注入式攻击是指利用设计上的漏洞攻击系统。如果动态生成SQL语句时没有对用户输入的数据进行过滤&#xff0c;便会使SQL注入式攻击得逞。例如用下面的SQL语句判断用户名和密码&#xff1a;txtsql"select * from user_info where userid"&txtuserid &"…

linux输入一个用户看是否在工作,linux下的用户管理详解

linux下的用户管理详解useradd 命令详解添加用户想要对linux下面的帐号了解的话首先必须要了解的4个配置文件[rootlocalhost /]# cat /etc/passwd首先我们需要了解的是用户帐号的配置信息/etc/passwd里面的内容每个字段都以:分割&#xff0c;下面我们详细的看看每个字段的意思r…

Java命令学习系列(零)——常见命令及Java Dump介绍

Java命令学习系列&#xff08;零&#xff09;——常见命令及Java Dump介绍 一、常用命令&#xff1a; 在JDK的bin目彔下,包含了java命令及其他实用工具。  jps:查看本机的Java中进程信息。  jstack:打印线程的栈信息,制作线程Dump。  jmap:打印内存映射,制作堆Dump。  …

优秀程序员的十个习惯

在这个世界上&#xff0c;有数百万的人热衷于软件开发&#xff0c;他们有很多名字&#xff0c;如&#xff1a;软件工程师&#xff08;Software Engineer&#xff09;&#xff0c;程序员&#xff08;Programmer&#xff09;&#xff0c;编码人&#xff08;Coder&#xff09;&…

linux下jmap 内存命令,Linux下jmap命令查看内存使用

Linux下jmap命令查看内存使用jmap -heap 1234(1234为进程号)jmap是JDK自带的一个工具&#xff0c;非常小巧方便&#xff0c;其支持参数如下&#xff1a;-heap打印heap空间的概要&#xff0c;这里可以粗略的检验heap空间的使用情况。例&#xff1a;jmap -heap 12345输出&#xf…

BZOJ3144: [Hnoi2013]切糕

题目&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3144 把每一条z轴都拿出来&#xff0c;s->(x,y,1),cf[x][y][1];(x,y,k)->(x,y,k1),cf[x][y][k];(x,y,r)->t,cinf 然后对于四联通的点&#xff0c;(x,y,z)->(x,y’,z-d) 似乎这叫经典的最小割模型…