2012-05-03 73 views
1

我只是想在我的Map中添加一個Polyline,它顯示在tableviewcell中。不幸的是 委託方法沒有被調用......如果有人知道爲什麼會很好。MKMapView委託方法不起作用

我tableview.h:

#import <UIKit/UIKit.h> 
#import "Route.h" 
#import <MapKit/MapKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface RoutesDetailView : UITableViewController<MKMapViewDelegate>{ 
    Route *myRoute; 
    MKMapView *mapView; 
    // the view we create for the line on the map 
    MKPolylineView* _routeLineView; 

    // the rect that bounds the loaded points 
    MKMapRect _routeRect; 
    MKPolyline* _routeLine; 
} 

@property (nonatomic, retain) Route *myRoute; 
@property (nonatomic,retain) MKMapView *mapView; 
@property (nonatomic, retain) MKPolyline* routeLine; 
@property (nonatomic, retain) MKPolylineView* routeLineView; 

-(MKPolyline *) loadRoute: (Route *) theRoute; 
@end 

而且我tableview.m:

@implementation RoutesDetailView 
    @synthesize myRoute,mapView; 
    @synthesize routeLine = _routeLine; 
    @synthesize routeLineView = _routeLineView; 

    - (id)initWithStyle:(UITableViewStyle)style 
    { 
     self = [super initWithStyle:style]; 
     if (self) { 
      // Custom initialization 
     } 
     return self; 
    } 

    - (void)didReceiveMemoryWarning 
    { 
     // Releases the view if it doesn't have a superview. 
     [super didReceiveMemoryWarning]; 

     // Release any cached data, images, etc that aren't in use. 
    } 

    #pragma mark - View lifecycle 

    - (void)viewDidLoad 
    {  
     [super viewDidLoad]; 
     MKMapView *myMap = [[MKMapView alloc] initWithFrame:CGRectMake(10, 1, 300 , 300)]; 
     myMap.layer.cornerRadius = 10.0; 
     [self setMapView:myMap]; 
     [mapView setDelegate:self]; 
     CLLocationCoordinate2D annotationCoord; 
     annotationCoord.latitude = [[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultPointLAT", nil)] doubleValue]; 
     annotationCoord.longitude = [[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultPointLONG", nil)] doubleValue]; 
     MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init]; 
     annotationPoint.coordinate = annotationCoord; 
     MKCoordinateRegion region = 
     MKCoordinateRegionMakeWithDistance (annotationPoint.coordinate,[[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultCircle", nil)] doubleValue], [[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultCircle", nil)] doubleValue]); 
     [mapView setRegion:region animated:NO]; 
     // Uncomment the following line to preserve selection between presentations. 
     // self.clearsSelectionOnViewWillAppear = NO; 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
    } 

    - (void)viewDidUnload 
    { 
     [super viewDidUnload]; 
     // Release any retained subviews of the main view. 
     // e.g. self.myOutlet = nil; 
    } 

    - (void)viewWillAppear:(BOOL)animated 
    { 
     [super viewWillAppear:animated]; 
    } 

    - (void)viewDidAppear:(BOOL)animated 
    { 
     [super viewDidAppear:animated]; 
    } 

    - (void)viewWillDisappear:(BOOL)animated 
    { 
     [super viewWillDisappear:animated]; 
    } 

    - (void)viewDidDisappear:(BOOL)animated 
    { 
     [super viewDidDisappear:animated]; 
    } 

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
     // Return YES for supported orientations 
     return (interfaceOrientation == UIInterfaceOrientationPortrait); 
    } 

    #pragma mark - Table view data source 


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
. 
. 
. 

      static NSString *CellIdentifier = @"CellMap"; 
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
      [mapView setFrame:CGRectMake(10, 1, cell.frame.size.width-20 , cell.frame.size.height-1)]; 
      [cell addSubview:mapView]; 
      [mapView addOverlay:[self loadRoute:myRoute]]; 
      return cell; 
. 
. 
. 

    } 




    #pragma mark - Table view delegate 
    -(MKPolyline *) loadRoute: (Route *) theRoute 
    { 

     MKMapPoint northEastPoint; 
     MKMapPoint southWestPoint; 

     // create a c array of points. 
     MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * theRoute.latitude.count); 

     for(int idx = 0; idx < theRoute.latitude.count; idx++) 
     { 

      CLLocationDegrees latitude = [[[theRoute latitude] objectAtIndex:idx] doubleValue]; 
      CLLocationDegrees longitude = [[[theRoute longitude] objectAtIndex:idx] doubleValue]; 

      // create our coordinate and add it to the correct spot in the array 
      CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude); 

      MKMapPoint point = MKMapPointForCoordinate(coordinate); 

      // 
      // adjust the bounding box 
      // 

      // if it is the first point, just use them, since we have nothing to compare to yet. 
      if (idx == 0) { 
       northEastPoint = point; 
       southWestPoint = point; 
      } 
      else 
      { 
       if (point.x > northEastPoint.x) 
        northEastPoint.x = point.x; 
       if(point.y > northEastPoint.y) 
        northEastPoint.y = point.y; 
       if (point.x < southWestPoint.x) 
        southWestPoint.x = point.x; 
       if (point.y < southWestPoint.y) 
        southWestPoint.y = point.y; 
      } 

      pointArr[idx] = point; 

     } 

     // create the polyline based on the array of points. 
     self.routeLine = [MKPolyline polylineWithPoints:pointArr count:theRoute.latitude.count]; 

     _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x - southWestPoint.x, northEastPoint.y - southWestPoint.y); 

     // clear the memory allocated earlier for the points 
     free(pointArr); 
     return self.routeLine; 


    } 

    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay 
    { 
     NSLog(@"DELEGATE CALL"); 
     MKOverlayView* overlayView = nil; 

     if(overlay == self.routeLine) 
     { 
      //if we have not yet created an overlay view for this overlay, create it now. 
      if(nil == self.routeLineView) 
      { 
       self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine]; 
       self.routeLineView.fillColor = [UIColor redColor]; 
       self.routeLineView.strokeColor = [UIColor redColor]; 
       self.routeLineView.lineWidth = 15; 
      } 

      overlayView = self.routeLineView; 

     } 

     return overlayView; 

    } 


    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     // Navigation logic may go here. Create and push another view controller. 
     /* 
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; 
     // ... 
     // Pass the selected object to the new view controller. 
     [self.navigationController pushViewController:detailViewController animated:YES]; 
     */ 
    } 

    @end 
+0

你的意思viewForOverlay不叫?記錄添加的每個點的緯度和經度,並確保它們是正確的(未交換,在範圍內等)。另外,在malloc中你可以獲得CLLocationCoordinate2D的大小,但是數組包含MKMapPoint結構。這兩個結構是不一樣的,但它們碰巧有相同的大小,所以你不會看到任何問題。 – Anna

+0

是的,viewForOverlay沒有被調用,lat和longs是正確的。此委託方法在另一個View Controller中完美工作,但在uitableview單元中不起作用 – Bene

回答

5

試試這個,我有同樣的問題。嘗試了很多組合後,這是一個有效的工具。

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

@interface MapViewController : UIViewController<MKMapViewDelegate> { 

    MKMapView *mapView; 
} 

和實現...

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    mapView = [[MKMapView alloc] initWithFrame: CGRectMakeFullScreenIphone]; 
    mapView.delegate = self; 
    [mapView setMapType: MKMapTypeStandard]; 
    [self.view addSubview: mapView]; 


    MKCoordinateRegion newRegion; 
    // configure region... 
    [mapView setRegion:newRegion animated:YES]; 

    CLLocationCoordinate2D coordinate; 
    //configure coordinate... 

    MKPointAnnotation *annotation = [[MKPointAnnotation alloc]init]; 
    [annotation setCoordinate:coordinate]; 
    [annotation setTitle:@"TEST"]; 
    [mapView addAnnotation:annotation]; 
} 

上面的簡單的代碼工作正常,被稱爲委託的方法。

0

,如果你正在運行在模擬器的應用程序,那麼

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay 

此委託方法將不會被調用,您需要在iOS設備上運行。

0

第一甲基是

MapView類:regionDidChangeAnimated:

,第二個是

MapView類:didUpdateUserLocation:

頭文件

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

@interface ViewController : UIViewController <MKMapViewDelegate> 
@property (weak, nonatomic) IBOutlet MKMapView *mapView; 
@property (weak, nonatomic) IBOutlet UIButton *searchButton; 

@end 

實現文件

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.mapView.delegate = self; 
    self.mapView.mapType = MKMapTypeStandard; 
    self.mapView.showsUserLocation = YES; 
    self.searchButton.hidden = YES; 
} 

- (IBAction)setMapType:(UISegmentedControl *)sender { 
    switch (sender.selectedSegmentIndex) { 
     case 0: 
      self.mapView.mapType = MKMapTypeStandard; 
      break; 
     case 1: 
      self.mapView.mapType = MKMapTypeSatellite; 
      break; 
     case 2: 
      self.mapView.mapType = MKMapTypeHybrid; 
      break; 
     default: 
      break; 
    } 
} 

- (IBAction)zoomToCurrentLocation:(UIBarButtonItem *)sender { 
    float spanX = 0.00725; 
    float spanY = 0.00725; 
    MKCoordinateRegion region; 
    region.center.latitude = self.mapView.userLocation.coordinate.latitude; 
    region.center.longitude = self.mapView.userLocation.coordinate.longitude; 
    region.span.latitudeDelta = spanX; 
    region.span.longitudeDelta = spanY; 
    self.searchButton.hidden = YES; 
    [self.mapView setRegion:region animated:YES]; 
} 

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { 
    self.searchButton.hidden = NO; 
} 

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
    [self.mapView setCenterCoordinate:userLocation.coordinate animated:YES]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
相關問題