2013-03-11 11 views
5

Mam kontroler widoku mapy (UIViewController, MKMapView), z jego delegatem (HCIResultMapViewController).niestandardowe zmienne danych w mkannotation

Chcę mieć następującą funkcjonalność w tej części.

1). Chciałbym wykorzystać moje zamówienie NSObject, tak że mogę skojarzyć pozostały szczegóły wraz z podstawowych jednostek, takich jak tytuł, napisy itp

Stąd według moich potrzeb I kodowane następująco

W HCIResultMapViewController

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 

_houseList = [[_resultList objectForKey:@"result"] objectForKey:@"listings"]; 

// NSLog([_houseList description]); 

int i = 0; 

for (NSDictionary *house in _houseList) { 

    HCIAnnotationViewController *annotation = [[HCIAnnotationViewController alloc] 
            initwithHouse:house]; 
    [_mapView addAnnotation:annotation]; 
    // NSLog(@"asdjhasdjsajdhaksdjghasdasdjahsdahskvdka"); 
    self.currIdentifier = i; 
    i++; 
} 

[_mapView setShowsUserLocation:NO]; 
} 

Pozostałe funkcje delegata

-(void) mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { 

for (NSObject<MKAnnotation> *annotation in _mapView.selectedAnnotations) { 
    NSLog(@"hellomaster"); 
    NSLog(annotation.title); 
    if ([annotation isKindOfClass:[HCIAnnotationViewController class]]) { 
     NSLog(@"hellomaster"); 
    } 
} 

ostatni

-(MKAnnotationView*) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { 

NSString *identifier = @"currIdentifier"; 

    MKPinAnnotationView *annotationView = 
    (MKPinAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 

    if (annotationView == nil) { 
     annotationView = [[MKPinAnnotationView alloc] 
          initWithAnnotation:annotation 
          reuseIdentifier:identifier]; 
    } else { 
     annotationView.annotation = annotation; 
    } 

    annotationView.enabled = YES; 
    annotationView.canShowCallout = YES; 
annotationView.tag = self.currIdentifier; 

    // Create a UIButton object to add on the 
    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    [rightButton setTitle:annotation.title forState:UIControlStateNormal]; 
    [annotationView setRightCalloutAccessoryView:rightButton]; 

/* 
    UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeInfoLight]; 
    [leftButton setTitle:annotation.title forState:UIControlStateNormal]; 
    [annotationView setLeftCalloutAccessoryView:leftButton]; 
    */ 
    return annotationView; 
} 

Ale widzę, że równoważność klas zawodzi. Czy możesz mi powiedzieć, co robię źle?

Myślę, że chcę, w prostych słowach, jak wysłać dane (NSDictionary *) wraz z adnotacją, aby móc je odzyskać, kiedy tylko chcę?

Proszę nie oznaczać tego jako powtarzające się pytanie. Próbowałem wielu pytań, googlowałem itp., Ale nie mogłem znaleźć odpowiedniego rozwiązania.

+0

Chcesz utworzyć adnotację niestandardową, np. Tytuł, podtytuł? – iPatel

+0

nie. Chcę, aby moja adnotacja zawierała NSDictionary * wraz z takimi podmiotami, jak tytuł, podtytuł. –

Odpowiedz

1

nie mogłem znaleźć dokładną drogę do wdrożenia niestandardowe zmienne danych lub przyczyna niepowodzenia równoważności mojej klasy. Ale wymyśliłem sposób na pokonanie takiej sytuacji. Może to być metoda nadmiarowa, ale nadal działa jak urok.

Chodzi o to, aby użyć systemu oznaczania w przycisku sterowania. Zauważyłem, że za każdym razem, gdy wysyłam wiadomość do mojego widoku mapy, aby dodać adnotację, natychmiast wywoływana jest moja metoda viewforannotation. Ponieważ przeprowadzam iterację poprzez tablicę, utrzymałem wskaźnik globalny indeksu, przy pomocy którego ustawiam znacznik przycisku sterującego. Później, po kliknięciu przycisku, pobieram znacznik i używam go do uzyskania pożądanego obiektu.

Każdy, kto ma jakieś alternatywne lub bezpośrednie rozwiązanie, proszę pisać.

1

Tutaj można również ustawić instancję NSMutableDictionary z NSString.
Tworzenie niestandardowych AnnotationView:

#import <MapKit/MapKit.h> 

@interface AnnotationView : MKPlacemark 

@property (nonatomic, readwrite, assign) CLLocationCoordinate2D coordinate; 

@property (nonatomic, strong) NSString *title; //Here You cam set `NSMutableDictionary` instand of `NSString` 
@property (nonatomic, strong) NSString *subtitle; //Here You cam set `NSMutableDictionary` instand of `NSString` 


@end 

aw .m file

#import "AnnotationView.h" 

@implementation AnnotationView 

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary 
{ 
    if ((self = [super initWithCoordinate:coordinate addressDictionary:addressDictionary])) 
    { 
     self.coordinate = coordinate; 
    } 
    return self; 
} 

@end 

// Wykorzystanie Adnotacja Dodaj #import "AnnotationView.h" w odpowiednim .m file:

CLLocationCoordinate2D pCoordinate ; 
pCoordinate.latitude = LatValue; 
pCoordinate.longitude = LanValue; 

// Create Obj Of AnnotationView class 

AnnotationView *annotation = [[AnnotationView alloc] initWithCoordinate:pCoordinate addressDictionary:nil] ; 

    annotation.title = @"I m Here"; 
    annotation.subtitle = @"This is Sub Tiitle"; 

[self.mapView addAnnotation:annotation]; 
+0

Sugerujesz, że używam niestandardowego widoku adnotacji, który sam ma element (NSDictionary *)? Ale to nie wyjaśnia, dlaczego moja adnotacja niestandardowa zawodzi w przypadku równoważności klas. Czy możesz mi to wyjaśnić? –

Powiązane problemy