0

我需要实现一个MKMapView在某种意义上模仿的界面。具体来说,我需要支持方法

-(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)。但我不确定这是一个好主意以及如何安全地实施它。

4

1 回答 1

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;
}
于 2016-05-20T11:08:15.717 回答