【问题标题】:iOS MapKit didAddAnnotationViews method not called未调用 iOS MapKit didAddAnnotationViews 方法
【发布时间】:2011-03-16 06:07:42
【问题描述】:

一旦数据被解析,我正在尝试从一个单独的类加载注释。我通过 NSLog 正确解析数据。我将数据发送到负责加载 MKMapView 的类。此类接收正确的数据。

这是解析我的数据的类 (ParseData.m) 的代码:

AnnotationsTest *loadFriend = [[AnnotationsTest alloc] init];
    [loadFriend loadOutAnnotations:friendFound];
    [loadFriend loadOutAnnotationsAgain];
    [loadFriend release];

在我的第二个类中调用的方法(MapViewController.m):

-(void)loadOutAnnotations:(NSMutableArray *)friendData

使用以下代码:

    CLLocationCoordinate2D workingCoordinate;

workingCoordinate.latitude = [[friendData objectAtIndex:5] floatValue];
workingCoordinate.longitude = [[friendData objectAtIndex:4] floatValue];
MapAnnotation *appleStore1 = [[MapAnnotation alloc] initWithCoordinate:workingCoordinate];
[appleStore1 setTitle:@"Title"];
[appleStore1 setSubtitle:@"subtitle"];
[appleStore1 setUserData:[friendData objectAtIndex:6]];
[appleStore1 setAnnotationType:iCodeBlogAnnotationTypeApple];

[self.mapView addAnnotation:appleStore1];

最后,这是我响应 addAnotation 事件的代码 (MapViewController.m):

- (void)mapView:(MKMapView *)mapViews didAddAnnotationViews:(NSArray *)views {
id myAnnotation = [mapViews.annotations objectAtIndex:0];
[mapViews selectAnnotation:myAnnotation animated:YES];
NSLog(@"didAddAnnotationViews is called");}

如果我硬编码变量,注释将完美加载,不要通过方法传递 NSMutableArray,并调用 MapViewController 类 viewDidLoad 部分中的方法。当我尝试调用该方法从另一个类添加注释时,didAddAnnotationViews 方法没有响应。

请指教。提前致谢!!

埃文

【问题讨论】:

  • NSMutableArray 是否可能在您将其传递给方法之前释放?你在哪里建立阵列?当您对哪些变量进行硬编码时,您能否再次详细解释一下究竟是什么工作?一步一步来?
  • 当我用坐标对 loadOutAnnotation 函数进行硬编码并从 MapViewController.m 的 viewDidLoad 部分调用它时,将出现注释。如果我尝试从 ParseData.m 调用 loadOutAnnotation 函数,它不会出现。我添加了 didAddAnnotationViews 希望加载注释,但没有运气。 NSMutableArray 只是传递坐标,我可以验证通过 NSLog 传递给 loadOutAnnotation 方法。让我知道我是否可以提供更多信息。感谢您对此进行调查!
  • 我认为很难弄清楚提供的代码量有什么问题。也许你可以把代码打包放在github之类的地方,或者把所有涉及的方法贴在这里。
  • 我创建了一个示例项目供您查看。我已经在 AnnotationProblemViewController.m 的 viewDidLoad 中注释掉了 [self loadOutAnnotation]。如果您取消注释此部分,注释将起作用。该项目目前正在尝试从由应用程序委托初始化的 CallAnnotation 调用注释(我简化了示例应用程序的过程)。有两个类(MapAnnotation 和 MapAnnotationView)定义了注解的设置。如果你看到任何东西,请告诉我。谢谢! [链接] (github.com/johnse4/Loading-Annotations)

标签: ios annotations mapkit android-mapview


【解决方案1】:

所以我查看了您的代码,这是预期的行为:地图注释只是注释的抽象表示。您必须“手动”将其添加到地图中。地图 THEN 向代表询问它应该用来显示注释的视图。因此,当您不将其添加到地图时,它不会显示也就不足为奇了 :)

【讨论】:

  • 谢谢约翰内斯!抱歉,我对 iOS 编程还是有点陌生​​。为了澄清,当我在 AnnotationProblemViewController.m 的 viewDidLoad 下添加带有 [self loadOutAnnotation] 的注释时,它可以工作,因为方法 - (MapAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation 告诉地图哪个查看它应该显示。但是当我从 CallAnnotation 调用 loadOutAnnotation 时,并没有调用这个方法来告诉地图显示哪个视图?我该如何纠正这个问题?
  • 我明白你在说什么。好的,这就是问题所在:在 CallAnnotation.m 中,您正在创建视图控制器的新实例。你不想要那个。您想从应用程序委托中使用视图控制器。因此,您需要在创建 CallAnnotation 实例时传递对该视图控制器的引用,然后在该视图控制器上调用 loadOutAnnotation。 (顺便说一句,如果你喜欢它,请对答案进行投票。这是 StackOverflow 上的好习惯 :))
  • 漂亮!谢谢谢谢!在这样一个简单的错误上花费了几个小时。为了正确调用 CallAnnotation 中的方法,我使用了以下代码: AnnotationProblemAppDelegate *appDelegate = (AnnotationProblemAppDelegate *)[[UIApplication sharedApplication] delegate]; [appDelegate.viewController loadOutAnnotations];
  • 再次感谢约翰内斯!我遇到了另一个问题。我上传给您的代码来自一个示例应用程序。我没有将功能移动到具有 UITabBarController 的窗口应用程序中。地图视图嵌套在这个控制器中,所以现在我需要弄清楚如何传递对它的引用。我发布了另一个问题link。如果您能指出我正确的方向,将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
相关资源
最近更新 更多