【原】iOS学习之KVC原理

本文详细解析了KVC(Key-Value Coding)的工作原理及其在iOS开发中的应用场景,特别是如何处理数据模型与实际数据不一致的情况,包括数据类型不匹配及额外数据字段等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. KVC的实现原理

  • 遍历字典里面所有的key,以name为例
  •  去模型中查找有没有setName:方法,有就直接调用赋值

  •  假如没有找到setName:方法,就会继续查找有没有_name属性,有就_name = value赋值

  •  假如没有找到_name,还会继续查找模型中有没有name属性

  •  最终没有找到,就会直接报错

  报错信息:

2. KVC原理的使用

 KVC主要用于model的赋值,model最好定义我们想要的属性,但是有时会和我们得到的数据有一些不同,以下是几种常见情况:

  • 当我们取到的数据多于model的属性时,根据KVC原理就会出现上述的错误,解决办法:在model的.m文件中重写setValue:forUndefinedKey:方法
#import "ZFFlag.h"

@implementation ZFFlag

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}

@end
  • 当我们需要的属性的类型和得到的数据的类型不同,解决办法:重写属性的setter方法(根据KVC的查找顺序可知)

  假如在视图中需要一张图片,但是得到的数据中一般是图片名,也就是一个 NSString * 类型的数据,具体解决办法请看代码

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface ZFFlag : NSObject

@property (nonatomic, strong) NSString *name;

@property (nonatomic, strong) UIImage *icon;

// 重写icon的setter方法,注意类型为得到的数据中该属性的类型
- (void)setIcon:(NSString *)icon
{
    _icon = [UIImage imageNamed:icon];
}

// 防崩
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}

@end
#import "ZFFlagView.h"

#import "ZFFlag.h"

@interface ZFFlagView ()

@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ZFFlagView

- (void)setFlag:(ZFFlag *)flag
{
    _flag = flag;
    
    // 给子控件赋值
    _label.text = flag.name;
    _imageView.image = flag.icon;
}

@end

 

转载于:https://www.cnblogs.com/gfxxbk/p/5518270.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值