IOS-Foundation-KVC

本文深入探讨了KVC(Key-Value-Coding)的概念、使用场合及实际应用案例,包括对象属性赋值、访问对象中其他对象的属性值、数组属性的获取与设置等。并展示了如何利用KVC自定义导航栏,以及在字典赋值中的特殊用法。
摘要由CSDN通过智能技术生成

本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。

1. 基本概念

KVC,即是指 Key-Value-Coding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。

为了说明其使用场合,首先建立一个Person类,然后分以下几点进行说明。

@class  Card;
@interface Person : NSObject

@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign) int age;
/* 引用了其他一个对象 */
@property (nonatomic,strong) Card *card;

@end

2. 使用场合

Situation One: 方法的形式参数是id类型

void setPerson(id person) {

    [person setValue:@"Jason" forKey:@"name"];
    [person setValue:@10 forKey:@"age"];
    
    NSString *name = [person valueForKey:@"name"];
    NSNumber *ageNumber = [person valueForKey:@"age"];
    NSLog(@"Name:%@,Age:%@",name,[ageNumber stringValue]);
}

下面的代码为方法调用

Person *p = [[Person alloc] init];
setPerson(p);

因为形参是id,所以肯定不可以使用点语法。这里就可以使用KVC进行对象属性的赋值取值工作。


Situation Two: valueForKey & valueForKeyPath

Person *p = [[Person alloc] init];
p.name = @"Jason";
    
NSString *name = [p valueForKey:@"name"];
NSLog(@"Name:%@",name);
    
p.card = [[Card alloc] init];
p.card.no = @"No.1";
NSString *cardId = [p valueForKeyPath:@"card.no"];
NSLog(@"Card Id:%@",cardId);
valueForKey 可以直接取得对象属性的值;如果对象中的属性是其他对象,就可以使用valueForKeyPath访问属性对象中得某个属性值,如上例中的cord.no


Situation Three: For Array

Person *p = [[Person alloc] init];
p.name = @"Rose";
    
Person *p2 = [[Person alloc] init];
p2.name = @"Jack";
    
Person *p3 = [[Person alloc] init];
p3.name = @"Dog";
    
NSArray *ps = @[p,p2,p3];
    
NSArray *names = [ps valueForKey:@"name"];
    
[ps setValue:@"Tom" forKey:@"name"];
    
NSLog(@"names:%@",names);


通过KVC快速得到对象数组中某个属性的值的集合

NSArray *names = [ps valueForKey:@"name"];

通过KVC快速重置数组中所有对象的某个属性值

[ps setValue:@"Tom" forKey:@"name"];


实际应用场景举例:

默认的导航控制器上面的leftBarButtonItem和rightBarButtonItem的位置是不能调节位置的,这时我们可以通过KVC自定义UINavigationBar,然后实现自己想要的效果,大致代码如下

[self setValue:[[LFNavigationBar alloc] init] forKey:@"navigationBar"];
这里的navigationBar是 UINavigationController 的只读属性,

@property(nonatomic,readonly) UINavigationBar *navigationBar;

是无法进行赋值操作的,但我们可以通过KVC进行修改操作。


3.   补充说明

setObject: forKey: 与  setValue: forKey:

NSMutableDictionary *dict = nil;
// 字典赋值只能用setObject
[dict setObject:@"Object" forKey:@"key"];
// 字典不能这样使用,是给KVC使用的
[dict setValue:@"Value" forKey:@"Key"];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋恨雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值