2016-05-20 1 views
0

Ich muss eine Schnittstelle, die MKMapView in gewissem Sinne nachahmt. Insbesondere müssen I Verfahren zur UnterstützungSo speichern Sie Daten mit ID-Schlüssel, die nicht NSCopying sind

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

Intern gibt eine Abbildung, die eine Anmerkung zu einem UIView Objekt abbildet ist (die null sein kann).

Also, wie sollte ich diese Anmerkungen und entsprechende Ansichten speichern? Die natürliche Wahl wäre 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; 
} 

Aber es funktioniert nicht, weil es keine Garantie dafür gibt, dass id<MyAnnotation>NSCopying entspricht.

Ich dachte über Speichern id<MyAnnotation> zu einem rohen Zeiger und dann Speichern des Zeigers in NSNumber (die NSCopying entspricht). Aber ich bin mir nicht sicher, ob das eine gute Idee ist und wie man es sicher umsetzt.

+0

Haben Sie NSHashTable in Betracht gezogen? http://shipster.com/nshashtable-and-nsmaptable/ – Mats

Antwort

0

Sie können eine eindeutige Zeichenfolge als Schlüsselpfad erstellen und in Ihrer Anmerkung speichern.

@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' ist ein Protokoll, keine Schnittstelle. Ich kann keine Dateien hinzufügen. – Nick

+0

Verwenden Sie KVC anstelle der Eigenschaft. – eason

Verwandte Themen