• KVO与KVC的使用(转)


    转自http://www.cnblogs.com/mybkn/archive/2013/05/29/3104166.html

    KVO:

    在看KVO之前,有必要先了解下KVC,即,Key-Value Coding 键值对编程。通过key-value可以方便的存取数据。

    具体的操作简单说就是:setValue:forKey:   valueForKey:

    //book Object
    //.h
    #import <Foundation/Foundation.h>
    @class Author;
    @interface Book : NSObject{
        NSString *name;
        Author *author;
        float price;
        NSArray *relativeBooks;
    }
    @end
    #import "Book.h"
    @implementation Book
    @end
    Book *book = [[Book alloc] init];
        [book setValue:@"iOS book" forKey:@"name"];//这里要注意实例变量的名字不要写错,写错了不会有提示
        NSString *name = [book valueForKey:@"name"];
        NSLog(@">> %@",name);
        
        Author *author = [[Author alloc] init];
        [author setValue:@"Zhan" forKey:@"name"];
        [book setValue:author forKey:@"author"];
        
        NSString *authorName = [book valueForKeyPath:@"author.name"];
        NSLog(@">> %@",authorName);
        
        [book setValue:@"100" forKey:@"price"];
        NSLog(@">> %@",[book valueForKey:@"price"]);
        
        Book *book1 = [[Book alloc] init];
        [book1 setValue:@"4" forKey:@"price"];
        Book *book2 = [[Book alloc] init];
        [book2 setValue:@"6" forKey:@"price"];
        
        NSArray *books = [NSArray arrayWithObjects:book1,book2,nil];
        [book setValue:books forKey:@"relativeBooks"];
        NSLog(@">>%@",[book valueForKeyPath:@"relativeBooks.price"]);

    KVO是基于kvc实现的,采取的是观察者的模式:

        book4=[[Book alloc] init];
        //增加观察者,为本类,keypath为book中的price对象,所以为price
        [book4 addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
        //修改值
        [book4 setValue:@"4" forKey:@"price"];
    //回掉方法,只要book4的值一改变就会回调这个方法


    -(void) observeValueForKeyPath:(NSString *)keyPath
    ofObject:(id)object
    change:(NSDictionary *)change
    context:(void *)context{
    NSLog(@"cel back");
    if([keyPath isEqual:@"price"]){
    NSLog(@">>>>>>>price is changed");
    NSLog(@"old price is %@",[change objectForKey:@"old"]);
    NSLog(@"new price is %@",[change objectForKey:@"new"]);
    }
    }

  • 相关阅读:
    需求分析-配置软件开发的出发点
    有关tab页的
    有关菜单的
    有关树形结构的
    需求分析-新闻发布的完整需求
    需求分析-网盘类的需求分析
    需求分析-有关有关富文本编辑器的需求
    Objective-C中的instancetype和id区别
    webservice远程调试开启
    Controller之间传递数据:Block传值
  • 原文地址:https://www.cnblogs.com/xiaobaizhu/p/3373677.html
Copyright © 2020-2023  润新知