MKMapView上的rightCalloutAccessoryView未显示

Ale*_*y V 4 iphone objective-c mkmapview ios

我的iphone应用程序没什么问题.我有这样的类和接口:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我的问题是,所有显示和工作,除了没有显示rightCalloutAccessoryView按钮.mapView已连接并在iphone视图上对CinemasMapController进行了删除操作(我也尝试[mapView setDelegate:self]).那么我做错了什么?

PS代码用线

pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
Run Code Online (Sandbox Code Playgroud)

执行 - 由NSLog检查.

它的外观如何 - 没有按钮: 它的外观如何 - 没有按钮

小智 10

viewForAnnotation,在if (!pinView)块中,一个新的本地pinView变量被声明,而不致分配给外变量.

因此,外部pinView变量永远不会被设置(保持nil),因此地图视图会创建您看到的默认注释视图.