1

標題幾乎說明了一切。我想創建一個NSMutableDictionary,我使用UIImageView來查找布爾值。這裏是什麼樣子:使用UIImageView作爲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

是的,問題是NSDictionary中的密鑰必須符合NSCopying協議,而UIImage不符合。

一個解決方案是給每個圖像一個獨特的標籤。然後使用圖片的標籤作爲密鑰(將其包裝在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屬性。

+0

謝謝,這有幫助。我感到困惑了一段時間,直到我意識到我必須設置自己的標記值(因爲沒有仔細閱讀您的答覆,我的錯是我的錯)。我也喜歡下面的哈希建議,因爲我不必考慮提出自己的ID。 – c31983 2013-02-18 03:30:10

1

NSDictionaries中的鍵必須符合NSCopyingUIImageView不符合。 您必須找到不同的密鑰,或者您可以擴展UIImageView以符合NSCopying。請參閱this answer on SO瞭解如何使用UIImage

3

rmaddy說得很對:NSDictionary必須符合NSCopying協議,UIImage不符合。

我建議使用image.hash作爲字典鍵。這就像UIImage的指紋。

+0

使用'hash'作爲鍵可能工作。請記住,有可能兩個圖像具有相同的「哈希」值。儘管只有少量圖片,但機會非常小。 – rmaddy 2013-02-17 22:45:46