传值方式

一:通知传值:可以实现任意界面的传值(A想让B执行一个方法)

A.m

[[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeNameNotification 根据此参数识别谁通知的 " object:self userInfo:@{@"name":self.textField.text} 要传递的信息 ];
B.m

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNameNotification:带参数的通知) name:@"ChangeNameNotification" object:nil];

再在A控制器中实现ChangeNameNotification:方法

-(void)ChangeNameNotification:(NSNotification*)notification{

 

    NSDictionary *nameDictionary = [notification userInfo];//接收信息

    

    self.textLabel.text = [nameDictionary objectForKey:@"name"];


二:属性传值:是最简单的,但局限性也是最大的,仅限于从A页面push到B页面时用B的属性把值传过去,仅适用于两个有联系的Controller之间

三:代理传值  

代理传值有一个委托人和一个代理人,委托人会把自己想要做的事指定别人去做,这里的别人就指的是我们的代理人,委托人在指定代理人时将他想要做的事的相关信息会以参数的形式传递过去

比如我现在有两个ViewController:RootViewController和secondViewController RootViewController上面有一个push的button,点击button会推出secondViewController,sencondView上面有一个TextField,当我pop到rootViewController的时候会把TextField里面的内容显示在RootViewController的label上,用代理的解决方法就是让sencondViewController作为委托人,委托我们的RootViewController当代理人,这样我就可以在委托secondViewController做事的时候把我的TextField的文本信息以参数的形式传递给RootViewController,这样RootViewController的label上就能显示我的文本值了,具体步骤如下:

SecondViewController.h

1:先要通过协议制定一个规范(这个规范是由委托人来制定)可能有人会问为什么是委托人来制定呢,很简单,只要想一下老板让你干的事难道规范要由你来指定吗,而且这套规范是对所有的代理人都适用的,所以也应该由委托人来制定

  @protocol SencondDelegete<NSObject>
  -(void)setLableText:(NSString *)str;//这是我们协议里面的内容,所有的代理人都要执行这个协议
  @end

2:在委托类里面声明一个属性

@property(nonatomic,assign)id<SencondDelegete>delegate;

SecondViewController.m
3:在pop之前把相关信息通过参数传递过去

-(void)back{

    [self.delegete setLableText:self.tf.text];
    [self.navigationController popToRootViewControllerAnimated:YES]
     }

RootViewController.m

4:在RootViewController中导入委托类,在接口处声明代理

#import "secondViewController.h"
@interface ViewController : UIViewController<SencondDelegete>

5:在push时设置SecondViewController的代理是self

-(void)push{
    secondViewController *sencondVc =[[secondViewController alloc]init];
    sencondVc.delegete = self;
    [self.navigationController pushViewController:sencondVc animated:YES];
}

6:在这个代理方法里就获得了委托类发送给你的信息

-(void)setLableText:(NSString *)str {
    self.label.text = str;
}


四:block传值 :我要把B中的值传给A(A   push 到B,B pop到A)

B.h

@property(nonatomic,copy)void(^Thirdblock)(NSString *str);//注意这里的属性必须为copy,不然会报错  *Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的

B.m

  if (self.Thirdblock) {

        self.Thirdblock(self.tf.text);

    }

A.m

B *thirdVc =[[B alloc]init];

        thirdVc.Thirdblock = ^(NSString *str){

            self.blockLable.text = str;

          

        };






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值