App两个页面之间的正反传值方法

正向传值:

一、利用present 的 block 块进行正向传值

   RootViewController.m中:

 

   SubViewController * svc = [[SubViewControlleralloc]init];

    

    //svc.label.text = @"正向Block传值";

    

    //这句是正向的属性传值,作用是让B页面,能持有A页面的地址,因B要向A进行反向传值

    //想给谁传值,就要持有谁的地址

    svc.delegate =self;

 

    

    [selfpresentViewController:svc animated:YEScompletion:^{

        svc.label.text =@"正向Block传值";

    }];



 

 

二、利用AB页面中的属性传值

 

反向传值:

一、利用block来进行 b界面向 a 界面反向传值

 

a 中声明一个 block属性,将所要传的值放入block  函数指针中,b去接收

.h文件

@property(nonatomic,copy)void(^blockColor) (UIColor *);

.m文件

self.blockColor([UIColor blackColor]);

 

注意用 copy

 

b.m文件中 接收

svc.blockColor = ^(UIColor *color){

    self.view.backgroundColor = color;

};

 

二、通知中心和观察者模式反向传值

 

例: viewController1向 viewController2传值

1.

Appdelegate 文件中,有一个接收所要传递的值的变量,用来保存所要传递的数据,界面1写入,界面2读取

@property (nonatomic,copy)NSString *string;

 

2.

viewController1中,当要传值的时候(按钮按下时),将数据通过UIApplication单例获取到的Appdelegate *delegate,传入Appdelegate文件中。同时向通知中心发送一个广播

 

[[NSNotificationCenter defaultCenter] postNotificationName:@"鬼子来了" object:nil];

 

3.

viewController2 中,向通知中心注册,添加自己,成为观察者。当数据改变时,用单例delegate 读取数据

 

-(void)becomObserver

{

    //获得通知中心,注册成观察者

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeText) name:@"鬼子来了" object:nil];

}

//收到广播消息后调用的方法

-(void)changeText

{

    //首先获取appDelegate的对象

    

    AppDelegate * appDeleagte = [UIApplication sharedApplication].delegate;

    NSString * string = appDeleagte.string;

    NSLog(@"sss:%@",string);

    

    label.text = appDeleagte.string;

    NSLog(@"label.txt = %@",label.text);

    

}

 

 

三、利用协议,界面反向传值

 

 AppDelegate

viewController2为委托方,viewController1为代理,

在viewController2中委托方制定协议,并且属性delegate = viewController1,要遵循协议;

在viewController1中,将viewController2对象的属性delegate设为自己(vc1)

 

1.ViewController1.m

 

  vc2.delegate = self;

 

2.ViewController2.h文件

 

//委托方制定协议,代理人必须遵守

@protocol BackValueDelegate<NSObject>

-(void)changeText:(NSString *)string

@end

@interface ViewController1 :UIViewController

//用来设置代理,并且遵守协议

@property (nonatomic,retain) id<BackValueDelegate>delegate;

@end

 

3. ViewController2.m文件

 //利用代理去回传数据

    [self.delegate changeText:@"****"];

 

posted @ 2016-03-14 20:44  清浅晨曦  阅读(526)  评论(0编辑  收藏  举报