传值

来源:互联网 发布:淘宝多肉植物哪家好 编辑:程序博客网 时间:2024/05/22 00:39


/*================== ***** KVO传值 **** ==========================

                   =====================


// 注册当前控制器为Boy对象的观察者身份,当boy对象的属性发生变化的时候,就会通知控制器

/*

 第一个参数:要成为观察者的对象,在这里就是self

 第二个参数:就是观察者要追踪的变化的属性名

 第三个参数:关注的属性的变化规则

 第四个参数:是一个const char* 一般用于传值操作

 */


[boy addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:NULL];


// 观察者对象要实现的方法,当被观察的模型对象的属性发生改变的时候,这个方法将会被回调,我们可以在这里获取我们想要知道的内容

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    //参数objcet就是当前我们观察的对象指针

   if ([object isMemberOfClass:[Boy class]]) {

        // 属性变化的新旧值都在参数change

        NSString* oldName = [change objectForKey:@"old"];

        NSString* newName = [change objectForKey:@"new"];

        NSLog(@"old:%@,new:%@",oldName,newName);

    }

}

// 当我们更改模型对象boyname属性的时候,观察者(当前控制器对象)就会观察到boy得变化

- (IBAction)boyChnage:(id)sender {

    boy.name =self.boyField.text;

}

/*===============***   end   ***===================================

     ------------------------------------------------------

 */



//==================== *** KVC *** ================================

//                ========================


#import "GCZRootViewController.h"

#import "GCZFirstViewController.h"

@interface GCZRootViewController ()


// 用于保留下一级视图回传的数据

@property (strong,nonatomic) NSString* firstString;

-voidkvc传值

{

    GCZFirstViewController* firstVC = [[GCZFirstViewController alloc] init];

    //使用KVC传值的好处是,无须关注对象的内部结构,我甚至可以不知道当前赋值的对象是什么,都可以对其进行赋值

    //如果对象不存在我们要赋值的属性,就会报错,解决办法是,先判断对象能否响应这个属性的setter方法

   if ([firstVC respondsToSelector:@selector(setColorString:)]) {

        [firstVC setValue:@"red" forKey:@"colorString"];

    }

    //让下一级视图控制器对象保留当前控制器对象的地址,方便数据回传

   if ([firstVC respondsToSelector:@selector(setLastVC:)]) {

        [firstVC setValue:self forKey:@"lastVC"];

    }


    [self presentViewController:firstVC animated:YES completion:nil];

}


#import "GCZFirstViewController.h"


@interface GCZFirstViewController ()


@property (strong,nonatomic) NSString* colorString;

// 用于保留上一级视图控制器对象的地址

@property (weaknonatomic) id lastVC;


-void)回传

{

    // 使用KVC回传数据

   if ([self.lastVC respondsToSelector:@selector(setFirstString:)]) {

        [self.lastVC setValue:@"yellow" forKey:@"firstString"];

    }

    

    [self dismissViewControllerAnimated:YES completion:nil];

}



//======================== end ================================

//                  =================



/*

                    ++++++++++++++++

 +++++++++++++++++++++ 通知中心传值 +++++++++++++++++++++++++++++

              ++++++++++++++++++++++++++

*/

//【注】一定是先注册观察者身份,后向通知中心传值,这个顺序不能反


#import "GCZFirstViewController.h"

#import "GCZSecondViewController.h"

- (void)通知中心

{

   /*

     第一个参数:要注册成为观察者的对象

     第二个参数:接收到暗号的时候,观察者对象要响应的方法

     第三个参数:通知中心接受到的消息(暗号),暗号是由被观察的一方发出

     第四个参数:观察者一方要携带的参数,指定为nil

     */

    

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeAction:) name:@"change" object:nil];

}


- (void)changeAction:(NSNotification*)noti

{

    //使用通知中心获取参数

    NSString* str = [noti object];

    NSLog(@"first str = %@",str);

   if ([str isEqualToString:@"red"]) {

       self.view.backgroundColor = [UIColor redColor];

    }

}


#import "GCZSettingViewController.h"

- (IBAction)changeBtn:(id)sender {

    // 获取通知中心

    NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];

    // 向通知中心发送暗号“change”

    //第二个参数就是我们要传递给观察者的值,这个参数不局限于字符串,也可以是字典、数组等等

    [defaultCenter postNotificationName:@"change" object:@"red"];

}



/*======================= 通知中心传值结束 ========================

              ===========================




================          * 单例传值 *     ===================

               ==================================

*/


//单例的方法是保证对象的唯一,,,在运用单例传值的时候一定要建立一个单例类

#import <Foundation/Foundation.h>


// 定义自己的单例类

@interface GCZColorModel : NSObject

// 单例方法,保证对象唯一

+ (GCZColorModel*)sharedColorModel;


//实现部分,要牢记

#import "GCZColorModel.h"

@implementation GCZColorModel


static GCZColorModel *sharedColorModel =nil;//这个要写在上面


+(GCZColorModel *)sharedColorModel

{

   static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        sharedColorModel = [[self alloc]init];

        

    });

   return sharedColorModel;

    //dispath_once函数不仅意味着代码仅会运行一次,而且还意味着此线程还是线程同步的;


}


0 0