2

我会尽量保持简单:

我对Objective-C(或实际上是编程)非常陌生,所以我可能需要一个解释而不仅仅是一个答案。

我正在尝试做和不能做的事情(还): 在点击它的披露后获取一个 pin 的坐标,并最终通过一个 segue。实际上,我正在单击我刚刚创建的图钉上的“信息”图标,我想在另一个页面(网络视图)中查看它的信息。此页面将显示坐标(以及我们在这里不需要的其他内容)。

为什么: 实际上,我在用户之前创建的图钉注释上单击“信息”图标,我想在另一个页面(网络视图)中查看它的信息。此页面将显示坐标(以及我们在这里不需要的其他内容)。

我的别针坐标存储在一个

CLLocationCoordinate2D位置;

我不能重复使用我之前使用的变量,因为它们可能已经过时了(只有当用户要求创建最后一个变量时它才会起作用......)而且我不知道如何获得图钉的坐标;必须有一种方法或其他东西,但我找不到它。我在互联网上找到了很多答案,但似乎没有一个有效,可能是因为我没有正确理解它们。无论如何,我无法使用它们。

我将向您展示我的一些代码,我想这很简单:

有 viewDidLoad,你可能想看看它,我猜:

- (void)viewDidLoad
{
    [super viewDidLoad];
    name = [[NSString alloc]init];
    detail = [[NSString alloc]init];
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longpressToGetLocation:)];
    lpgr.minimumPressDuration = 2.0;  //user must press for 2 seconds
    [_map addGestureRecognizer:lpgr];
    CLLocationCoordinate2D loc = CLLocationCoordinate2DMake(50.837863, 4.353616);
    MKCoordinateSpan span = MKCoordinateSpanMake(.035, .035);
    MKCoordinateRegion reg = MKCoordinateRegionMake(loc, span);
    self.map.region = reg;
    [self buildBaseAnno];
    self.map.showsUserLocation = true;
}

我知道这很重要,但老实说,我并不完全理解这一点是如何工作的;不过,它确实有效。:D

    -(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView* v = nil;
    {
        static NSString* ident = @"Pin";
        v = [_map dequeueReusableAnnotationViewWithIdentifier:ident];
        if (v == nil)
        {
            v = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
            ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed;
            UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            v.rightCalloutAccessoryView = infoButton;
            v.centerOffset= CGPointMake(0,-20);
            v.canShowCallout= YES;
        }
        v.annotation = annotation;
    }
    return v;
}

触摸针创建:

- (void)longpressToGetLocation:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan)
        return;

    CGPoint touchPoint = [gestureRecognizer locationInView:self.map];
    location = [self.map convertPoint:touchPoint toCoordinateFromView:self.map];

    [self showAlertName];
}

实际的注释/引脚创建方法

-(void)buildAnno
{
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = location.latitude;
    coordinate.longitude = location.longitude;
    MKPointAnnotation* newann = [MKPointAnnotation new];
    newann.coordinate = coordinate;

    newann.title = name;
    newann.subtitle = detail;
    [self.map addAnnotation:newann];
}

请告诉您是否需要更多代码;我不太确定我能给你什么,因为我的代码可能是“正确的”(或体面的),我只需要真正知道如何获取我需要的信息(即,坐标和来自我的 pin 的其他内容)刚刚轻拍。)

而且我实际上没有点击图钉,我点击图钉注释中的披露。无论如何,这已经足够了!

一旦我能捕捉到这些坐标,我相信我将能够通过 segue 传递它们,因为传递数据已经在这里得到很好的解释,但是如果有什么“特别”,如果你能将它添加到我会很高兴您的解释是因为我仍然对这一切感到非常不舒服,而且我发现的大多数教程/指南/链接并没有真正帮助我。

非常感谢您的时间和帮助:)

(编辑:我在这里发现了一个类似的问题,但我相信我需要额外的帮助/解释。)

4

1 回答 1

1

您不需要手势识别器 - 地图视图委托协议已经有一个方法可以告诉您何时点击标注附件calloutAccessoryControlTapped并且此方法接收相关的annotationView. 该annotationView.annotation属性使您回到相关的注释对象,然后您可以访问其coordinate属性以获取图钉的坐标。

首先,在您的类中创建一个新属性:

 @property CLLocationCoordinate2D tappedCoord;

然后实现委托方法

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    MKPointAnnotation *annotation=(MKPointAnnotation*)view.annotation;
    self.tappedcoord=annotation.coordinate;
    [self performSegueWithIdentifier:@"detailViewSegue"];   // Use your appropriate segue identifier
}

然后您可以访问中的属性prepareForSegue(再次,更改为适当的 segue 名称和目标视图控制器类)

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"detailViewSegue" ]){
        DetailViewController *dvc=(DetailViewController *)segue.destinationViewController;
        dvc.coord=self.tappedCoord;
}

此外,由于您的 MapView 正在显示用户的位置,因此会有一个注释。您需要在您的viewForAnnotation方法中解决这个问题,如果注释不是您的注释,则返回 nil。您可以检查注释的类别以确定这一点 -

-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView* v = nil;
    if ([annotation isMemberOfClass:[MKPointAnnotation class]]) {
        static NSString* ident = @"Pin";
        v = [_map dequeueReusableAnnotationViewWithIdentifier:ident];
        if (v == nil)
        {
            v = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
            ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed;
            UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            v.rightCalloutAccessoryView = infoButton;
            v.centerOffset= CGPointMake(0,-20);
            v.canShowCallout= YES;
        }
        v.annotation = annotation;
    }
    return v;
}
于 2014-05-14T21:41:27.233 回答