1

Название в значительной степени говорит обо всем. Я хочу создать NSMutableDictionary, где я использую UIImageViews для поиска булевых значений. Вот как это выглядит:Использование UIImageView в качестве ключа в NSMutableDictionary для поиска boolean

Мой .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

Спасибо, это помогло. Я немного смутился, пока не понял, что мне нужно установить собственное значение тега (моя ошибка в том, что я не читал ваш ответ так тщательно, как должен был). Я вроде как предложение хэша ниже, так как мне не нужно было думать о том, чтобы придумать свои собственные идентификаторы. – c31983

1

Ключи NSDictionaries должны соответствовать NSCopying и UIImageView нет. Вам нужно будет найти другой ключ, или вы можете продлить UIImageView, чтобы он соответствовал NSCopying. См. this answer on SO, как это сделать с помощью UIImage.

3

rmaddy сказал, что это довольно правильно: NSDictionary должен соответствовать протоколу NSCopying, а UIImage - нет.

Я рекомендую использовать image.hash в качестве словаря. Это похоже на отпечаток UIImage.

+0

Использование 'hash', поскольку ключ может работать. Имейте в виду, что два изображения могут иметь одно и то же значение «хэш». Хотя с несколькими изображениями шансы довольно малы. – rmaddy

Смежные вопросы