从未调用过MKAnnotation viewForAnnotation

时间:2012-10-14 03:27:56

标签: iphone objective-c

我已在.h中添加UIViewController<MKMapViewDelegate>并已添加

 -(void) viewDidLoad {
     self.mapView.delegate = self;
 }

但方法viewForAnnotation从未调用

MapViewController.h

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

   @interface Tela1ViewController : UIViewController<MKMapViewDelegate> {
       IBOutlet MKMapView *mapView;
   }

   @property (nonatomic, retain) MKMapView *mapView;
   @end

MapViewController.m

  -(void) viewDidLoad {
      self.mapView.delegate = self;
  }

  - (void)viewDidAppear:(BOOL)animated
  {
      AppDelegate *appDelegate = (AppDelegate *)[[UIApplication shared

      mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
      mapView.mapType = MKMapTypeSatellite;

      CLLocationCoordinate2D coord = {latitude: appDelegate.latitude, longitude: appDelegate.longitude};
      MKCoordinateSpan span = {latitudeDelta:0.2, longitudeDelta: 0.2};
      MKCoordinateRegion region = {coord, span};

      [mapView setRegion:region];

      PlaceMark *addAnnotation = [[PlaceMark alloc] initWithCoordinate:coord];  
      [mapView addAnnotation:addAnnotation];  
      [self.view addSubview:mapView];
  }

  - (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
  {
      NSLog(@"test");
  }

2 个答案:

答案 0 :(得分:3)

好的,你的代码中需要解决几件问题......

MKMapView代表

nil。为什么?因为您在MKMapView方法中设置了viewDidLoad的委托。但是当你查看viewDidAppear:时,你正在分配新的MKMapView而你没有在那里设置代理。由于在viewDidLoad之前调用viewDidAppear:,因此委托只是nil =未设置。

调用超级

当您覆盖某些方法时,请阅读文档。因为您可以在viewDidAppear:文档中找到它,例如:

您可以覆盖此方法以执行与显示视图相关的其他任务。如果重写此方法,则必须在实现中的某个时刻调用super。

MKMapView&amp; IBOutlet中

并且还不明白为什么MKMapViewIBOutlet,然后您分配新的MKMapView并将其添加为子视图。此外,如果您的IBOutlet确实与XIB中的MKMapView相关联,那么最终会有两个MKMapView,因为旧的(来自XIB)不会从超级视图中删除。

你显然搞砸了。去阅读有关UIKit的更多信息,......

答案 1 :(得分:0)

尝试使用以下内容替换viewDidAppear方法的最后几行:

CLLocationCoordinate2D coord = {.latitude =  location.latitude, .longitude =  location.longitude};
MKCoordinateSpan span = {.latitudeDelta = 0.2, .longitudeDelta =  0.2};
MKCoordinateRegion region = {coord, span};

[mapView setRegion:region];

MapAnnotation *addAnnotation = [[MapAnnotation alloc] initWithCoordinate:coord];
[mapView addAnnotation:addAnnotation];
[self.view addSubview:mapView];