天天看點

【原】iOS學習之KVC原理

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      
kvc

繼續閱讀