Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

custom data variables in mkannotation

I have a map view controller (UIViewController, MKMapView), with its delegate (HCIResultMapViewController).

I wish to have following functionality in this part.

1). I wish to use my custom made NSObject , so that I can associate others details along with the basic entities like title, subtitle etc.

Hence according to my needs I coded as following

In 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];
}

The other delegate functions

-(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");
    }
}

The last one

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

But I see that the class equivalence fails. Can you tell me what I'm doing wrong?

I think what I want, in simple words, is, how can I send some data (NSDictionary*) along with a annotation such that I can retrieve it whenever I want?

Please dont tag this as repeated question or so. I have tried many questions, googling etc. but couldn't find a suitable solution for this.

like image 377
Ravi Vooda Avatar asked Nov 03 '22 02:11

Ravi Vooda


2 Answers

Here You can also set NSMutableDictionary instand of NSString.
Create custom 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

And in .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

// Use Annotation Add #import "AnnotationView.h" in your relevant .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];
like image 146
iPatel Avatar answered Nov 13 '22 16:11

iPatel


I couldn't find exact way to implement custom data variables or the reason why my class equivalence fails. But I figured out a way to over come this kind of situation. This might be redundant in method, but still works like a charm.

So the idea is to use the tagging system in control button. I observed that every time I send a message to my map view to add a annotation it immediately calls my viewforannotation method. Since I'm iterating through an array, I maintained a index global pointer, with which I set tag of the control button. Later when the button is clicked, I retrieve the tag and use it to get the object I want.

Anyone else have any alternative or direct solution, please do post.

like image 44
Ravi Vooda Avatar answered Nov 13 '22 15:11

Ravi Vooda