IOS开发——UI基础-KVC

除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。

如何使用KVC存取对象属性呢?看个示例

一、使用KVC存数据

定义一个person类

.h文件

#import <Foundation/Foundation.h>

@class Dog;

@interface Person : NSObject

/** 姓名*/
@property (nonatomic, copy)NSString *name;

/** 钱*/
@property (nonatomic, assign)double money;

/** 宠物*/
@property (nonatomic, strong)Dog *dog;

@end

.m文件

#import "Person.h"

@implementation Person
{
    @private
    int _age;
}

- (void)say
{
    NSLog(@"age = %i", _age);
}

@end

再定义一个dog类

.h

#import <Foundation/Foundation.h>

@interface Dog : NSObject

/** 狗的外号*/
@property (nonatomic, copy)NSString *name;

/** 狗的价格*/
@property (nonatomic, assign)double price;
@end

.m

#import "Dog.h"

@implementation Dog

@end

先创建一个对象

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

p.name = @"chg"; // setter

p.money = 998.0;

除了这种方式赋值,可以使用KVC

#pragma mark 单个值

     //      KVC == KEY VALUE CODING
     // Value : 值, 只能传对象
     // forKey: 需要给谁(哪个属性)赋值
     // setValue:forKey:方法, 只能给对象的直接属性赋值
     [p setValue:@"lmj" forKey:@"name"];
     // @(998.0) == [NSNumber numberWithDouble:(double)]
     [p setValue:@(668.0) forKey:@"money"];
#pragma mark 多层赋值
    p.dog = [Dog new];
         p.dog.name == [[p dog] setName:]
         p.dog.name = @"wangwang";
         p.dog.price = 110.0;
     // setValue:forKeyPath: 可以给对象的间接属性赋值. 多层赋值
     // 建议: 以后在开发中都使用setValue:forKeyPath:
         [p setValue:@"xiaoqiang" forKeyPath:@"dog.name"];
         [p setValue:@(110) forKeyPath:@"dog.price"];
#pragma mark 给私有成员变量赋值
         [p setValue:@"lnj" forKey:@"_name"];
         [p setValue:@(30) forKey:@"_age"];

         SEL sel = @selector(say);
         [p performSelector:sel];
         [p say];
#pragma mark 字典转模型

    NSDictionary *dict = @{
                           @"name":@"xxx",
                           @"money": @(998.1),
                           //                           @"score":@(100)
                           @"dog":@{
                                   @"name":@"wangcai",
                                   @"price":@(110)
                                   }
                           };

    // 注意点:
    // 1.如果想使用KVC进行字典转模型, 那么字典中的key必须和模型中的属性一模一样(个数 + 名称)
    //  this class is not key value coding-compliant for the key score.‘
    // 2.如果使用KVC进行字典转模型, 只能对当前调用KVC方法的对象进行转换, 不能对它的属性的对象进行转换

    // setValuesForKeysWithDictionary:方法内部的实现原理
    // 1.会拿到字典中的key, 然后根据这个key取出字典中的值, 然后再根据这个key赋值给对象
    //   [p setValue:@"xxx" forKey:@"name"];
    [p setValuesForKeysWithDictionary:dict];

    NSLog(@"p.dog = %@", p.dog);

    NSLog(@"name = %@, money = %f", p.name, p.money); // getter

二、使用KVC取数据

首先设置一些数据

    Person *p = [Person new];
    p.name = @"chg";
    p.money = 998;
    p.dog = [Dog new];
    p.dog.name = @"wangcai";
    p.dog.price = 110;

有以下几种方式取值

#pragma mark 获取单个值
    NSString *name =  [p valueForKey:@"name"];
    NSLog(@"name = %@", name);
    double money = [[p valueForKey:@"money"] doubleValue];
    NSLog(@"money = %f", money);
#pragma mark 获取多层值
    NSString *dogName = [p valueForKey:@"dog.name"];
    NSString *dogName = [p valueForKeyPath:@"dog.name"];
    NSLog(@"dogName = %@", dogName);
#pragma mark 模型转字典
    NSDictionary *dict = [p dictionaryWithValuesForKeys:@[@"name", @"money"]];
#pragma mark 获取数组中对象的值

    Person *p1 = [Person new];
    p1.name = @"zs";
    p1.money = 111;

    Person *p2 = [Person new];
    p2.name = @"ls";
    p2.money = 222;

    Person *p3 = [Person new];
    p3.name = @"ww";
    p3.money = 666;

    NSArray *arr = @[p1, p2, p3];

    // 如果数组中的元素都是同一种类型的数据, 可以使用KVC获取数组中所有对象的某个属性的值
    NSArray *res = [arr valueForKeyPath:@"name"];
    NSLog(@"res = %@", res);
    
#pragma mark 运算符
    // 获取arr数组中money的平均值
    id res1 = [arr valueForKeyPath:@"@avg.money"];
    // 获取arr数组中money的最大值
    id res2 = [arr valueForKeyPath:@"@max.money"];
    // 获取arr数组中money的最小值
    id res3 = [arr valueForKeyPath:@"@max.money"];
    NSLog(@"res1 = %@,res2 = %@,res3 = %@", res1,res2,res3);
时间: 2024-10-29 19:06:42

IOS开发——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篇—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 #impo

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基础—IOS开发中Xcode的一些使用技巧

iOS开发UI基础-IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文件 视图 option + cmd + 回车 打开助理编辑器 cmd + 回车           显示主窗口 cmd + 0             导航窗口 option + cmd + 0    工具窗口 在.m & .h之间切换           control + cmd + 上/下

IOS开发UI基础—在UIImageView中添加按钮以及Tag的参数说明

ios开发UI基础-在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwithtag: 提示点:在xib中如果想要通过tag参数获取对应的控件(属性),不要把tag的参数设置为0,因为xib中所有的对象默认tag都为0,设置为0取不到对象. 二.ImageView中添加按钮(1)ImageView和Button的比较 Button按钮的内部可以放置多张图片(4),而Im

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

iOS开发UI基础—简单的浏览器查看程序

iOS开发UI基础-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 1 // 2 // YYViewController.m 3 // 03-图片浏览器初步 4 // 5 // Created by apple on 14-5-21. 6 // Copyright (c) 2014年 itcas

iOS开发UI基础—transframe属性(形变)

iOS开发UI基础-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建"基于控件初始位置"的形变 CGAffineTransformMakeTranslation(平移) CGAffineTransformMakeScale(缩放) CGAffineTransformMakeRotation(旋转) (2) 创建"基于trans

iOS开发UI基础—懒加载

iOS开发UI基础-懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 2.使用懒加载的好处: (1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 (2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 3.代码示例 1 // 2 // YYViewController.m