0

UIImage の画像の値を文字列として取得する必要があります。

以前は私がやっていた:

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

しかし今、私はより多くの条件を持っているので、次のようにしてスイッチを使用したいと思います:

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

これを達成する方法はありますか?ありがとう!

4

3 に答える 3

2

うーん、ここで何を達成したいのか[UIImage imageNamed:@"image1.png"]わかりませんが、を使用することは、まったく理由もなくオンザフライで新しい UIImage オブジェクトを作成しているため、比較を行うには間違いなく非常に悪い方法です。さらに、 == 演算子を使用しているときにそれらはオブジェクトであるため、 isEqual を使用する必要があります。

あなたがしたいことは、おそらくbase 64文字列に変換することだと思いますか?. もしそうなら、あなたはこれを使用します:

NSData *imageData = UIImageJPEGRepresentation(myImage, 1.0);

NSString *encodedString = [imageData base64Encoding];
于 2012-09-09T17:41:29.400 に答える
1

によって提供された答えH2C03は適切です。辞書を使用して名前を関連付けます。

ただし、代わりに連想オブジェクトを使用することもできます。連想オブジェクトを使用すると、空間と時間の両方にコストがかかることに注意してください。ただし、連想オブジェクトは、このタイプのケース (カテゴリ プロパティの追加) にのみ便利です。

@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
于 2012-09-09T18:06:18.000 に答える
0

あなたのアプローチはどちらも正しくありません。最初のものはキャッシング (文書化されていません) に依存していますが、2 つ目は構文エラーです。'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"
}
于 2012-09-09T17:48:12.917 に答える