在模型中存储UIImage的最佳方法

时间:2015-09-08 04:14:21

标签: ios objective-c model-view-controller uiimage nsdata

我对iOS开发和MVC概念都很陌生,但根据我的理解,该模型不应该包含任何与UI相关的内容。我的images.xcassets文件夹中有一个名为defaultImage的图像,我想在初始化时将其设置为我的类的默认图像。这个类是我的模型的一部分,并具有以下公共接口:

#import <Foundation/Foundation.h>

@interface myClass : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSData *imageData;

@end

我将图像存储为NSData的原因是因为我假设模型中不允许使用UI,因此我不能在此处使用UIImage。但是,我无法成功初始化imageData以包含图像数据。我尝试了以下方法:

#import "myClass.h"

@implementation myClass

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"No Name";
    self.imageData = [[NSData alloc] initWithContentsOfFile:@"defaultImage"];
    }
    return self;
}

@end

就像我说的那样,imageData会包含nil。环顾四周后,我找到了以下解决方案:

#import <UIKit/UIKit.h>
#import "myClass.h" 

@implementation myClass

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"No Name";
        self.imageData = [[NSData alloc] init];
        self.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"defaultImage"]);
    }
    return self;
}

@end

所以我的问题是,这是否打破了不允许在模型中使用UI和UIKit的规则?如果没有,请解释原因,如果是,是否有其他方法可以做到这一点?谢谢!

1 个答案:

答案 0 :(得分:2)

最好的方法是在模型中使用图像名称或图像路径,然后您可以在任何需要的位置加载图像。

#import <Foundation/Foundation.h>

@interface myClass : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *imageName;

@end

最坏的情况是,如果您必须在类本身中拥有数据,请使用如下。

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"No Name";
        //self.imageData = [[NSData alloc] init]; //--Not required
        self.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"defaultImage"]);
    }
    return self;
}