Alexey V
Alexey V

Reputation: 79

rightCalloutAccessoryView on MKMapView not show

I have little problem with my iphone application. I have such classes and interfaces:

CinemaMapAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface CinemaMapAnnotation : NSObject <MKAnnotation>{
    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;

}

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* subtitle;

-(id)initWithCoordinate:(CLLocationCoordinate2D) c;

@end

CinemaMapAnnotation.m

#import "CinemaMapAnnotation.h"

@implementation CinemaMapAnnotation

@synthesize title, subtitle, coordinate;

-(id)initWithCoordinate:(CLLocationCoordinate2D) c{
    self = [super init];
    if (self) {
        coordinate = c;
    }
    return self;
}

-(void) dealloc {
    self.title = nil;
    self.subtitle = nil;
    [super dealloc];
}


@end

CinemasMapController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "Cinema.h"
#import "CinemaMapAnnotation.h"
#import "PopcornuaAppDelegate.h"

@interface CinemasMapController : UIViewController <MKMapViewDelegate, MKReverseGeocoderDelegate> {
    MKMapView *mapView;
    MKReverseGeocoder *reverseGeokoder;
}

@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@property (nonatomic, retain) IBOutlet MKReverseGeocoder *reverseGeokoder;

@end

CinemasMapController.m

#import "CinemasMapController.h"

@implementation CinemasMapController

@synthesize mapView, reverseGeokoder;

...

#pragma mark - Map Anotation

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id)annotation
{
    static NSString* MyIdentifier = @"CinemaMapAnotation";
    MKPinAnnotationView* pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:MyIdentifier];
    if (!pinView)
    {
        MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc]
                                               initWithAnnotation:annotation reuseIdentifier:MyIdentifier] autorelease];
        pinView.draggable = NO;
        pinView.animatesDrop = NO;
        pinView.enabled = YES;
    } else {
        pinView.annotation = annotation;
    }

    if(annotation != mapView.userLocation){
        pinView.pinColor = MKPinAnnotationColorRed;
        pinView.canShowCallout = YES;
        // Add a detail disclosure button to the callout.
        pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        pinView.userInteractionEnabled = YES;
    } else {
        pinView.pinColor = MKPinAnnotationColorGreen;
    }
    return pinView;
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    NSLog(@"Not show button, so not work");
}

...

@end

My problem is, what all show and work, except not show rightCalloutAccessoryView button. mapView connected and have delegete to CinemasMapController on iphone view (also I try [mapView setDelegate:self]). So what I do wrong?

P.S. Code with line

pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

execute - checked by NSLog.

Here how its look like - no button: How its look like - no button

Upvotes: 4

Views: 5144

Answers (1)

user467105
user467105

Reputation:

In viewForAnnotation, in the if (!pinView) block, a new local pinView variable is being declared instead of getting assigned to the outer variable.

As a result, the outer pinView variable never gets set (stays nil) and so the map view creates the default annotation view which is what you see.

Upvotes: 10

Related Questions