2016-05-20 8 views
0

Мне нужно реализовать интерфейс, который имитирует MKMapView в некотором смысле. В частности, мне нужно поддерживать методыКак хранить данные с ключами ключа, которые не являются NSCopying

-(void)addAnnotation:(id<MyAnnotation>)annotation; 
-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation; 

Внутри есть отображение, которое отображает аннотацию к UIView объекта (который может быть пустым).

Итак, как хранить эти аннотации и соответствующие представления? Естественный выбор будет NSMutableDictionary:

@property(nonatomic) NSMutableDictionary *m_dict; 

-(void)addAnnotation:(id<MyAnnotation>)annotation { 
    UIView *view = ....; 
    if (view) { 
     [_m_dict setObject:view forKey:annotation]; 
    } 
    else { 
     [_m_dict setObject:[NSNull null] forKey:annotation]; 
    } 
} 

-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation { 
    id ret = [_m_dict objectForKey:annotation]; 
    if ([ret isKindOfClass:[UIView class]]) { 
     return ret; 
    } 
    return nil; 
} 

Но это не работает, потому что нет никакой гарантии, что id<MyAnnotation> соответствует NSCopying.

Я думал о сохранении id<MyAnnotation> необработанному указателю, а затем сохранил указатель на NSNumber (который соответствует NSCopying). Но я не уверен, что это хорошая идея и как реализовать ее безопасно.

+0

Вы считаете NSHashTable? http://nshipster.com/nshashtable-and-nsmaptable/ – Mats

ответ

0

Вы можете создать уникальную строку в качестве ключевого пути и сохранить ее в своей аннотации.

@property(nonatomic) NSMutableDictionary *m_dict; 

-(void)addAnnotation:(id<MyAnnotation>)annotation { 
    UIView *view = ....; 
    NSString *unique_id = ....; 
    [annotation setValue:unique_id forKey:@"_unique_id"]; 
    if (view) { 
     [_m_dict setObject:view forKey:unique_id]; 
    } 
    else { 
     [_m_dict setObject:[NSNull null] forKey:unique_id]; 
    } 
} 

-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation { 
    id ret = [_m_dict objectForKey:annotation valueForKey:@"_unique_id"]; 
    if ([ret isKindOfClass:[UIView class]]) { 
     return ret; 
    } 
    return nil; 
} 
+0

'MyAnnotation' - это протокол, а не интерфейс. Я не могу добавить к нему файлы. – Nick

+0

Используйте KVC вместо свойства. – eason

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

  • Нет связанных вопросов^_^