1

タイトルはほとんどそれをすべて言います。UIImageViews を使用してブール値を検索する NSMutableDictionary を作成したいと考えています。外観は次のとおりです。

私の .h ファイル:

@interface ViewController : UIViewController{
    UIImageView *image1;
    UIImageView *image2;
    NSMutableDictionary *isUseable;
}

@property (nonatomic, retain) IBOutlet UIImageView *image1;
@property (nonatomic, retain) IBOutlet UIImageView *image2;
@property (nonatomic, retain) NSMutableDictionary *isUseable;

私の .m ファイル:

@synthesize image1, image2;
@synthesize isUseable

- (void)viewDidLoad
{
    isUseable = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                 @NO, image1,
                 @NO, image2,nil];
}

-(void)runEvents{
    if(some condition){
        [isUseable setObject:@YES forKey:(id)image1];
    }

    //Use it later:
    if(isUseable[image1]){
        //Do stuff
    }
}

コンパイルされますが、実行すると、キャッチされない例外 'NSInvalidArgumentException' が発生します。理由: '-[UIImageView copyWithZone:]: 認識されないセレクターがインスタンスに送信されました。

問題は、NSDictionary クラスがそのキーをコピーするという事実にあると推測しています。この場合、辞書を機能させる方法はありますか? そうでない場合、希望するようなルックアップをどのように設定すればよいですか? アイデア/提案はありますか?

4

5 に答える 5

4

はい、問題は、 のキーがプロトコルにNSDictionary準拠する必要があり、準拠していないことです。NSCopyingUIImage

1 つの解決策は、各画像に一意のタグを付けることです。次に、画像のタグをキーとして使用します( でラップした後NSNumber)。

- (void)viewDidLoad {
    isUseable = [ @{ @(image1.tag) : @NO, @(image2.tag) : @NO } mutableCopy];
}

-(void)runEvents {
    if(some condition) {
        [isUseable setObject:@YES forKey:@(image1.tag)];
    }

    //Use it later:
    if(isUseable[@(image1.tag)]) {
        //Do stuff
    }
}

tag各画像のプロパティを表示するコードを追加するだけです。

于 2013-02-17T21:39:33.667 に答える
3

rmaddy はかなり正しいと言いました。プロトコルにNSDictionary準拠する必要がありますが、準拠していません。NSCopyingUIImage

@(image.hash)辞書のキーとして使用することをお勧めします。の指紋のようなものですUIImage

于 2013-02-17T22:33:06.590 に答える
1

のキーはNSDictionaries準拠する必要があり、準拠しNSCopyingUIImageViewいません。別のキーを見つける必要があります。または、UIImageView準拠するように拡張することもできますNSCopying。でそれを行う方法については、SOのこの回答を参照してくださいUIImage

于 2013-02-17T21:41:20.173 に答える
0

画像から生データを取得し (再レンダリングされた PNG または JPG 表現ではありません)、組み込みの共通暗号を介して実行し、データの SHA256 を取得します。これがキーになります。

他の回答は、組み込みのインスタンス プロパティを使用することを提案しています.hashが、衝突が発生しやすく、頻繁に発生します (アプリの 1 つで文字列の衝突が発生し、重大なバグが発生しました)。

#include <CommonCrypto/CommonDigest.h>

-(NSString *)keyFromImage:(UIImage *)image {

    NSData *imageData = (__bridge NSData *)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256((__bridge const void *)imageData, (CC_LONG)imageData.length, result);
    
    NSMutableString *imageHash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) {
        [imageHash appendFormat:@"%02x",result[i]];
    }
    
    return imageHash;

}
于 2021-05-20T21:12:23.720 に答える