0

MKMapView何らかの意味で模倣するインターフェイスを実現する必要があります。具体的には、メソッドをサポートする必要があります

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

UIView内部的には、注釈をオブジェクト (null の場合もある)にマップするマッピングがあります。

では、これらの注釈と対応するビューをどのように保存すればよいでしょうか? 自然な選択は次のようになります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 に答える