3

当用户触摸地图时,我在添加注释时遇到了一些问题。

UIGestureRecognizer用来检测用户的触摸。

当检测到长按时,我正在调用此函数:

- (void)handleLongPressGesture:(UIGestureRecognizer*)gestureRecognizer{
if (gestureRecognizer.state == UIGestureRecognizerStateEnded) return;

NSLog(@"long press");

CGPoint touchPoint = [gestureRecognizer locationInView:mapView];   
CLLocationCoordinate2D touchMapCoordinate = 
[mapView convertPoint:touchPoint toCoordinateFromView:mapView];

RdvAnnotation *rdvAnnotation = [[RdvAnnotation alloc] init];

[rdvAnnotation initWithCoordinate:touchMapCoordinate];

[mapView removeAnnotations:mapView.annotations]; 

[mapView addAnnotation:rdvAnnotation];

[rdvAnnotation release]; }

我可以在控制台中看到 NSLog 并rdvAnnotation使用良好的坐标进行初始化。

我不明白为什么我在地图上看不到我的注释。

这是我的- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation方法:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation{
if ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;

if ([annotation isKindOfClass:[RdvAnnotation class]]) 
{
    static NSString* RdvAnnotationIdentifier = @"rdvAnnotationIdentifier";
    MKPinAnnotationView* pinView = (MKPinAnnotationView *)
    [mapView dequeueReusableAnnotationViewWithIdentifier:RdvAnnotationIdentifier];

    if (!pinView)
    {
        MKPinAnnotationView* customPinView = [[[MKPinAnnotationView alloc]
                                               initWithAnnotation:annotation reuseIdentifier:RdvAnnotationIdentifier] autorelease];
        customPinView.pinColor = MKPinAnnotationColorPurple;
        customPinView.animatesDrop = YES;
        customPinView.canShowCallout = YES;

        return customPinView;

    }
    else
    {
        pinView.annotation = annotation;
    }
    return pinView;
}
return nil;}

我的viewDidLoad方法:

- (void)viewDidLoad {
[super viewDidLoad];

mapView = [[MKMapView alloc] initWithFrame:self.view.frame];
[mapView setShowsUserLocation:TRUE];
[mapView setMapType:MKMapTypeStandard];
[mapView setDelegate:self];

CLLocationManager *locationManager=[[CLLocationManager alloc] init];

[locationManager setDelegate:self];

[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];

[locationManager startUpdatingLocation];

self.navigationItem.title = @"Rendez-vous" ;    
}   
4

2 回答 2

0

我刚刚注意到一些看起来很奇怪的东西:

RdvAnnotation *rdvAnnotation = [[RdvAnnotation alloc] init];
[rdvAnnotation initWithCoordinate:touchMapCoordinate];

您在注释对象上调用了两次 init。你应该这样做:

RdvAnnotation *rdvAnnotation = [[RdvAnnotation alloc] initWithCoordinate:touchMapCoordinate]];

编辑: 如果您的 init 方法中有不想丢失的代码,请保留 init 并更改坐标属性的值:

RdvAnnotation *rdvAnnotation = [[RdvAnnotation alloc] init];
rdvAnnotation.coordinate = touchMapCoordinate;
于 2012-05-02T12:25:59.320 回答
0

viewDidLoad您创建一个新的地图视图对象。

首先,这个新的地图视图对象没有被添加为子视图,self.view因此它存在于内存中但不可见。

其次,您可能已经在 Interface Builder 的视图中放置了一个地图视图对象,因此您不需要创建一个新对象。

所以可能发生的情况是,当您添加注释时,它被添加到内存中的地图视图对象,而不是可见的对象(在 IB 中创建的对象)。

无需在 中创建新的地图视图,而是viewDidLoadmapViewIBOutlet 连接到 Interface Builder 中的地图视图。

于 2012-05-02T13:54:59.327 回答