UI基础之KVC介绍

一、KVC简单介绍

KVC key valued coding 键值编码

KVC通过键值间接编码

  补充:

与KVC相对的时KVO,即key valued observer 键值观察。监听某一个模型的属性,只要模型属性的值一变化就通知你。

二、代码颜色

1> 通过KVC设置值  setValue:    forKey:

1,1>

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Book *book;

@end

@implementation Person

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];
        [p1 setValue:@"zhangsan" forKey:@"name"];
        p1.age = 18;

        NSLog(@"name = %@, age = %d", p1.name, p1.age);
    }
    return 0;
}

通过执行结果可以看到这个方法通过对象的属性值设置value。

1,2> 通过KVC设置值  setValue:    forKeyPath:

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Book *book;

@end

@implementation Person

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];
        [p1 setValue:@"zhangsan" forKeyPath:@"name"];
        p1.age = 18;

        NSLog(@"name = %@, age = %d", p1.name, p1.age);
    }
    return 0;
}

可以看到两个方法执行效果一样,

[setValue:@"zhangsan" forKeyPath:@"name"];

要看到这个方法的好处,可以看下面这个例子:

1.3>

#import <Foundation/Foundation.h>

@interface Book : NSObject

@property (nonatomic, copy) NSString *bookName;

@end

@implementation Book

@end

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Book *book;

@end

@implementation Person

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];
        Book *b1 = [[Book alloc] init];

        p1.book = b1;
        [p1 setValue:@"同桌的你" forKeyPath:@"book.bookName"];

        NSLog(@"bookName = %@", b1.bookName);
    }
    return 0;
}

用KVC取一个嵌套层次很深的路径的时候,只要诶它一个路径就能把想要的属性给拿出来。(.可以理解为路径。一直一直进入)。能够帮助我们很方便的编码。

2,通过KVC取值:

#import <Foundation/Foundation.h>

@interface Book : NSObject

@property (nonatomic, copy) NSString *bookName;

@end

@implementation Book

@end

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Book *book;

@end

@implementation Person

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];
        Book *b1 = [[Book alloc] init];
        b1.bookName = @"同桌的你";
        p1.book = b1;

        NSString *bookName = [p1 valueForKeyPath:@"book.bookName"];

        NSLog(@"bookName = %@", bookName);
    }
    return 0;
}

结果:

当然我们也可以通过valueForKey:取值不过只能取person对象的属性的值,不能取到book对象中的属性值

3,将person对象放入到数组中,通过数组取的person对象中属性的值

代码:

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Book *book;

@end

@implementation Person

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];
        p1.name = @"zhangsan";

        Person *p2 = [[Person alloc] init];
        p2.name = @"lisi";

        NSArray *array = @[p1, p2];

        NSArray *name = [array valueForKeyPath:@"name"];

        NSLog(@"%@", name);

    }
    return 0;
}

结论:将对象放入到数组中,可以通过数组的valueForKeyPath:方法取出数组中存放对象的属性值,返回一个存放属性值的数组对象

4>KVC在字典中的应用

4.1 可以将字典中的键对应的值赋给对象的属性值

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Book *book;

@end

@implementation Person

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];

        NSDictionary *dic = @{@"name":@"zhangsan"};

        [p1 setValuesForKeysWithDictionary:dic];
        NSLog(@"%@", p1.name);

    }
    return 0;
}

4.2 可以将对象的属性值赋给字典键对应的值

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Book *book;

@end

@implementation Person

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];
        p1.name = @"zhangsan";
        p1.age = 19;

      NSDictionary *dic = [p1 dictionaryWithValuesForKeys:@[@"name", @"age"]];
        NSLog(@"%@", dic);

    }
    return 0;
}

用KVC取一个嵌套层次很深的路径的时候,只要诶它一个路径就能把想要的属性给拿出来。(.可以理解为路径。一直一直进入)。能够帮助我们很方便的编码

时间: 2024-10-10 23:38:43

UI基础之KVC介绍的相关文章

ios开发UI基础—Kvc简单介绍

一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observer 键值观察.监听某一个模型的属性,只要模型属性的值一变化就通知你. 二.使用KVC 1.KVC基本使用介绍 (1)代码示例: 新建一个命令行项目,用以演示KVC的用法 完成之后为项目添加一个Person类. 为Person类添加两个属性(name和age),注意这两个属性的类型. 1 #import <Foundation/Fo

ios开发-UI基础-超级猜图

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 本篇文章介绍一个比较综合的小应用----超级猜图. 功能分析: 根据显示的图片,在下面的待选项按钮中选中正确答案按钮,选中的按钮会显示在正确答案按钮中 答案错误,答案颜色变为红色,分数减小 答案正确,答案颜色变为蓝色,两秒自动跳入下一题,分数增加 点击"下一题"可以进入下一个题目 点击"大图",可以放大显示图片,再次点击图片或者背景,图片缩小至原来大小 点

iOS开发UI基础—字典转模型(部分内容转载他人)

iOS开发UI基础-字典转模型 开发中,通常使用第三方框架可以很快的实现通过字典转模型,通过plist创建模型,将字典的键值对转成模型属性,将模型转成字典,通过模型数组来创建一个字典数组,通过字典数组来创建一个模型数组等等. 一.能完成功能的"问题代码" 1.从plist中加载的数据 2.实现的代码 1 // 2 // LFViewController.m 3 // 03-应用管理 4 // 5 // Created by apple on 14-5-22. 6 // Copyrigh

ios开发-UI基础-应用管理(单纯界面)改进5-使用代理实现监听下载按钮的点击(delegate)

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 前几篇文章介绍了一个应用管理的小应用,从最开始的单纯实现功能,一步一步就行改进\封装,上篇文章是使用xib进行了优化,本篇文章使用代理实现监听下载按钮的点击. 在原来的基础上,使用代理的主要思路分析: 首先要新建一个协议 声明协议的要实现的方法(一般为optional) 声明一个遵守该协议的代理的属性 使用代理,通知其代理完成操作 在代理中的实现步骤: 遵守协议 设置代理(一般通过拖线

iOS开发UI基础—xib的简单使用

iOS开发UI基础-xib的简单使用 一.简单介绍 xib和stotyboard的比较,一个轻量级一个重量级. 二.xib的简单使用 1.建立xib文件 建立的xib文件命名为appxib.xib 2.对xib进行设置 根据程序的需要,这里把view调整为自由布局 建立view模型(设置长宽等参数) 调整布局和内部的控件 完成后的单个view 3.使用xib文件的代码示例 YYViewController.m文件代码如下: 1 // 2 // YYViewController.m 3 // 10

数据分析 关于基础组件与介绍

第二部分 关于基础组件与介绍 基础信息库种类 基础信息库是账户或者自然人的纯真数据库查询系统.系统内积累存储的数据包括有: ü 手机号归属信息 ü IP数据纯真库 ü GPS信息对应地址信息 ü 域名空间身份信息 ü 3G分组域通讯信息 ü VPN服务器基础信息 ü VPN服务器日志信息(最新的区域时间段) ü 国内运输系统基础数据 ü 网络帐号密码查询系统 ü 网络帐号详情搜索查询 3S定位技术 3S 是通过遥感技术(RS).地理信息系统(GIS).全球定位系统(GPS)实现位置确认技术的统称

OS开发UI基础—手写控件,frame,center和bounds属性

OS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View Contollor和view的关系 2.注意点 在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: [btn addTarget:sel

ios开发-UI基础-应用管理(单纯界面)改进2

本篇文章,通过字典转模型来改进上篇文章中的代码. 字典转模型,之前的文章已经介绍过,这里再重复一下:  字典转模型 字典:用来存储数据的,用键值对存储数据,是一个nsdictionary ,(不好处:key值容易写错) 模型: 用来存储数据的,一个字典对应一个模型,模型用属性来存储数据,是一个纯洁的object对象 @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *icon; 字典转模型:一个字

ios开发-UI基础-应用管理(单纯界面)改进4-xib封装

[注意]转载请注明出处:吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 上篇文章结尾介绍了一下为什么要对xib进行封装,这里不再赘述. 大体整理了一下封装的思路(我自己的想法,可能不是很清晰): 为了扩展,将xib的代码封装,创建一个类,来描述xib >在新建的.m文件中,新建一个类扩展(类似于viewController) >在新建的.h文件中,加入一个模型的属性(@class) >在新建的.m文件中,重写模型的set方法(在.h文件中已经加入了,自动生