/
//  KvoObject.h
//  KVO
//
//  Created by lin kang on 16/6/7.
//  Copyright © 2016年 lin kang. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface KvoObject : NSObject

@property (nonatomic,retain) NSString *changeStr;

@end






//
//  KvoObject.m
//  KVO
//
//  Created by lin kang on 16/6/7.
//  Copyright © 2016年 lin kang. All rights reserved.
//

#import "KvoObject.h"

@implementation KvoObject
@synthesize changeStr = _changeStr;

+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
    //进行手动调用观察者模式 返回NO
    if ([key isEqualToString:@"changeStr"]) {
        return NO;
    }else{
        return [super automaticallyNotifiesObserversForKey:key];
    }
}

-(NSString *)changeStr{
    if (_changeStr == nil) {
        _changeStr = @"KVO模式";
    }
    return _changeStr;
}

-(void)setChangeStr:(NSString *)changeStr{
    _changeStr = changeStr;
    //要进行触发观察者模式,需触发这两个方法
    [self willChangeValueForKey:@"changeStr"];
    [self didChangeValueForKey:@"changeStr"];
}
@end

  

 

 

//
//  ViewController.m
//  KVO
//
//  Created by lin kang on 16/6/7.
//  Copyright © 2016年 lin kang. All rights reserved.
//

#import "ViewController.h"
#import "AppDelegate.h"
#import "ViewController1.h"


@interface ViewController ()
{
    AppDelegate *_appDelegate;
    UILabel *_lable;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

    // Do any additional setup after loading the view, typically from a nib.
    UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 21)];
    lb.center =self.view.center;
    lb.text = _appDelegate.kvoObject.changeStr;
    lb.backgroundColor = [UIColor blueColor];
    _lable = lb;
    [self.view addSubview:lb];
    
    
    UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
    [bt setTitle:@"点我" forState:UIControlStateNormal];
    [bt setBackgroundColor:[UIColor redColor]];
    [bt setFrame:CGRectMake(100, 300, 60, 44)];
    [self.view addSubview:bt];
    [bt addTarget:self action:@selector(btc:) forControlEvents:UIControlEventTouchUpInside];

     //注册自己为观察者
    [_appDelegate.kvoObject addObserver:self forKeyPath:@"changeStr" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];
}

//接受观察通知
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    NSLog(@"change:%@",change);
    NSString *newStr = [change objectForKey:@"new"];
    _lable.text = newStr;
//    [self.view setNeedsDisplay];
}

-(void)btc:(UIButton *)sender{
    ViewController1 *vc1 = [[ViewController1 alloc] init];
    [self.navigationController pushViewController:vc1 animated:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

  

//
//  ViewController1.m
//  KVO
//
//  Created by lin kang on 16/6/7.
//  Copyright © 2016年 lin kang. All rights reserved.
//

#import "ViewController1.h"
#import "AppDelegate.h"

@interface ViewController1 ()
{
    AppDelegate *_appDelegate;
    UILabel     *_lable;
}
@end

@implementation ViewController1

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    // Do any additional setup after loading the view, typically from a nib.
    UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 21)];
    lb.center =self.view.center;
    lb.text = _appDelegate.kvoObject.changeStr;
    lb.backgroundColor = [UIColor blueColor];
    _lable = lb;
    [self.view addSubview:lb];
    
    
    UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
    [bt setTitle:@"改变对象" forState:UIControlStateNormal];
    [bt setBackgroundColor:[UIColor redColor]];
    [bt setFrame:CGRectMake(100, 300, 60, 44)];
    [self.view addSubview:bt];
    [bt addTarget:self action:@selector(changeing:) forControlEvents:UIControlEventTouchUpInside];
    //注册自己为观察者
    [_appDelegate.kvoObject addObserver:self forKeyPath:@"changeStr" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];
}

//改变对象
-(void)changeing:(UIButton *)sender{
    _appDelegate.kvoObject.changeStr = @"我变了,操!";
}

//接收通知
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    NSLog(@"change:%@",change);
    NSString *newStr = [change objectForKey:@"new"];
    _lable.text = newStr;
//    [self.view setNeedsDisplay];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

  所谓观察者模式运用:当对象属性改变是,同时通知多个页面的进行更改。