我会尽量保持这一点:
我对Objective-C(或实际编程)非常陌生,所以我可能需要解释而不仅仅是答案。
我尝试做什么但不能做什么: 在点击它的公开之后获得一个pin的坐标,并最终通过segue传递它。 实际上,我点击了我的"信息"我刚创建的图钉上的图标,我希望在另一个页面(webview)中看到它的信息。此页面将显示坐标(以及我们在此不需要的其他内容)。
为什么: 实际上,我点击了我的"信息"用户先前创建的针脚注释上的图标,我希望在其他页面(网页浏览)中查看该信息。此页面将显示坐标(以及我们在此不需要的其他内容)。
我的引脚坐标存储在
中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];
}
请告诉您是否需要更多代码;我不确定我能给你什么,因为我的代码可能是正确的&#39; (或体面),我只需要知道如何获取我需要的信息(即,我刚刚点击的引脚中的坐标和其他东西。)
我实际上没有点击引脚,我在引脚的注释中点击了公开内容。无论如何,现在已经足够了!
一旦我能够捕捉到这些坐标,我相信我能够通过segue传递它们,因为传递数据已经在这里得到了很好的解释,但如果有什么特别的&#39;,我&#如果你能把它添加到你的解释中,我真的很高兴,因为我仍然对这一切感到非常不舒服,而且我发现的大多数教程/指南/链接并没有真正帮助我。
非常感谢您的时间和帮助:)
(编辑:我发现了一个类似的问题here,但我相信我需要额外的帮助/解释。)
答案 0 :(得分: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;
}