2016-05-20 3 views
0

ある意味でMKMapViewを模倣するインターフェイスを実現する必要があります。具体的には、私は内部(nullの可能性がある)UIViewオブジェクトに注釈をマッピングするマッピングがある方法NSCopyingでないIDキーでデータを保存する方法

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

をサポートする必要があります。

これらのアノテーションと対応するビューはどのように保存する必要がありますか? id<MyAnnotation>NSCopyingに準拠していることを保証がないため、

@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; 
} 

しかし、それは動作しません:自然な選択はNSMutableDictionaryだろう。

生ポインタにid<MyAnnotation>を保存してからNSNumberNSCopyingに準拠)にポインタを格納することを考えました。しかし、私はこれが良いアイデアであり、安全に実装する方法はわかりません。

+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

関連する問題