如何将UIImage的图像作为NSString?

时间:2012-09-09 17:35:51

标签: ios cocoa-touch nsstring uiimage

我需要将UIImage图像的值作为字符串。

以前我在做:

if(images[imageNo].image == [UIImage imageNamed:@"image1.png"])
{

但现在我有更多的条件,所以我想使用一个开关,做:

switch(images[imageNo].image)
{
    case @"image1.png":
    break;
}

有没有办法实现这个目标?谢谢!

3 个答案:

答案 0 :(得分:2)

嗯我不确定你想要在这里完成什么但是使用[UIImage imageNamed:@"image1.png"],这绝对是一种非常糟糕的比较方式,因为你无缘无故地动态创建一个新的UIImage对象,此外当你使用isEqual时,你正在使用==运算符,因为它们是对象。

我相信你想要做的就是把它转换成一个基本的64字符串呢?如果是这样,你可以使用它:

NSData *imageData = UIImageJPEGRepresentation(myImage, 1.0);

NSString *encodedString = [imageData base64Encoding];

答案 1 :(得分:1)

H2C03提供的答案是恰当的。使用字典关联名称。

但是,另一种方法是使用关联对象。请注意,使用关联对象在空间和时间上都有成本,但它们只适用于这种情况(添加category-property)。

@interface UIImage (MyImageLabel)
@property (nonatomic, copy) NSString *label;
@end


#import <objc/runtime.h>
@implementation UIImage (MyImageLabel)
static char const kImageLabelKey[1];
- (NSString*)label {
    return objc_getAssociatedObject(self, kImageLabelKey);
}
- (void)setLabel:(NSString *)label {
    objc_setAssociatedObject(self, kImageLabelKey, label, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end

现在,您可以在UIImage实例上拥有label属性,如下所示:

myImage.label = someLabelStringCouldEvenBeFilename;

if ([myImage.label isEqualToString:someString]) {
}

典型的警告适用于某个类别中的任何内容。大多数人会鼓励您使用唯一的前缀或后缀来区分您的类别方法与潜在的未来Apple名称。

请注意,您可以在该类别中添加其他方法,例如......

+ (UIImage)myImageNamed:(NSString*)name {
    id result = [self imageNamed:name];
    [result setLabel:name];
    return result;
}

现在您自动设置标签。

当然,你可以将它作为一个子类,如果你将始终创建自己的图像,并避免与关联对象相关的“肮脏”(尽管你的所有图像都需要是MyUIImages)。

@interface MyUIImage : UIImage
@property (nonatomic, copy) NSString *label;
@end

@implementation MyUIImage
// Now, you override imageNamed:
+ (UIImage*)imageNamed:(NSString*)name {
    UIImage *image = [super imageNamed:name];
    self.label = name;
    return image;
}
@end

答案 2 :(得分:0)

您的两种方法都不正确。第一个依赖于缓存(没有记录),同时第二个是语法错误 - 'case'关键字期望编译时常量表达式。

据我所知,iOS SDK中没有这样的方法可以返回图像的文件名 - 只是因为它不是图像的属性(对于以编程方式创建的图像会返回什么?)。您应该尝试操作NSDictionary,将与文件名关联的UIImage对象存储为键,并使用isEqualToString:比较键。

因此,您应该只创建一次图像,并将它们存储在字典中:

// assuming `images` is an already created instance variable of your class
[images setObject:[UIImage imageNamed:@"ImgOne.png"] forKey:@"ImgOne.png"];
// and so on, with every image you need

// then once you have to check against a file name, use:
UIImage *img = [images objectForKey:@"FileName.png"];
if ([someImage isEqual:img]) {
    // you can now be sure that the image set to the object was once named "FileName"
}