3

我开始使用 iOS6 构建一个运行良好的应用程序,但后来由于更强大的原因,我不得不切换到 IOS5。但是,有一张地图一直给我带来问题。这张地图有许多类型的annotationView(例如电影院、餐馆、剧院......),每个都有自己的图像。当我从 iOS6 传递到 iOS5 时,我注意到 annotationView 的行为与以前不同,因为构造它们的委托方法的调用不再相同。我能做些什么?

-(void)viewDidLoad{

     //.....
     //extraction of elements from the tables in a database

  for(int i=0; i<7; i++){ //extraction tables from database

    //......

    for (int i =0; i< number; i++) { //extraction elements from tables

        self.chinaTable =[self.mutableArray objectAtIndex:i];

         CLLocationCoordinate2D coord=CLLocationCoordinate2DMake(self.chinaTable.latitudine, self.chinaTable.longitudine);

        AnnotationCustom *annotationIcone =[[AnnotationCustom alloc]initWithCoordinates:coord title:self.chinaTable.titolo subTitle:self.chinaTable.indirizzo];

        //.......

        [self.mapView addAnnotation:annotation];

        self.locationManager.delegate = self;
        self.mapView.delegate=self; //the problem is here

   }

  }

委托方法

  - (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id 
  <MKAnnotation>)annotation 
  {
        NSLog (@"the name of the table is %@", self.nomeTabella);
        // this NSLog you get only the name of the last open table

       //..........
       if ([annotation isKindOfClass:[AnnotationCustom class]]){
          static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
       MKAnnotationView *annotationView = (MKAnnotationView*) [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
       annotationView = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
      annotationView.annotation = annotation;
      AnnotationCustom *customAnnotation = (AnnotationCustom *)annotationView.annotation;

     //I create an annotation different depending on the name of the table of provenance

     if ([self.nomeTabella isEqualToString:@"Cinema"]){
            if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){
                annotationView.image = [UIImage imageNamed:@"iphone_cinema.png"];

                customAnnotation.nomeTabella = self.nomeTabella;
                customAnnotation.ID = self.chinaTable.ID;
                customAnnotation.china = self.chinaTable;

           }else{
                annotationView.image = [UIImage imageNamed:@"ipad_cinema.png"];
                customAnnotation.nomeTabella = self.nomeTabella;
                customAnnotation.ID = self.chinaTable.ID;
                customAnnotation.china=self.chinaTable;
            }

            //......

  }

委托方法viewForAnnotation不再在每个注解构建后被调用,而是仅在两个循环结束时调用,因此annotationView映射上只有内存中最后一个表的那些。我在哪里可以设置我委托方法以获得与以前相同的结果?ViewForAnnotation在 iPad 6.0 模拟器中工作正常,但在 iPad 模拟器 5.1 中不起作用,代码相同

4

3 回答 3

4

我很惊讶听到viewForAnnotation每次施工后才调用它。这不是记录的方式,也不是其他任何人使用的方式。viewForAnnotation可以并且将在您的应用程序中的任何时候调用。如果用户滚动地图以致某些注释消失,则可以在他们向后滚动地图并重新出现注释时调用它。或者,如果用户切换到另一个视图或应用程序然后返回。

您需要viewForAnnotation检查annotation一些属性的变量,这些属性可以让您确定如何绘制该视图。您不能依赖以任何特定顺序调用它。周围有大量示例代码将向您展示如何MKAnnotation使用您自己的类来实现协议,您可以向该类添加一些内容来告诉您它所代表的东西是电影院还是餐馆或其他什么,然后您获取正确的图像放置它变成了MKAnnotationView想要viewForAnnotation的作为返回值。

于 2012-11-15T19:31:15.073 回答
1

你的代码对我来说似乎没问题。实际上,我也在开发一个使用 Maps 的 Iphone 应用程序,我正在像你一样做。只有一个问题,你为什么要使用:

if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone)

是检查用户是在运行 iPad 还是 iPhone?

于 2012-11-23T15:56:23.767 回答
1

viewForAnnotation当您运行循环时(即添加 each 时MKAnnotation)不会被调用,因为您在 main 上runLoop。当你viewDidLoad完成并发生一个runLoop循环时,MKAnnotations(当前地图位置上的那些)将被绘制在屏幕上,从而调用你的delegate. 因此,当您调试和单步viewDidLoad执行时,您看不到对delegate方法的调用是完全正常的。

有几件事:

  • 您应该在循环之外设置您的委托方法。所以self.locationManager.delegate并且self.mapView.delegate应该在你的for循环之前设置,而不是在你的嵌套循环中设置一百万次。

  • 您正在重用i作为for...loop变量。我希望这只是由于您删除了在此处发布的业务逻辑,而不是在您的实际代码中。它可以解释为什么只有你的最后一组注释似乎被呈现。

你确定你没有操纵mapView.annotations嵌套中的其他地方for...loops吗?检查removeAnnotationssetAnnotations:两者都可能导致 中的注释与mapView您期望的不同。

你能展示你的annotation对象是如何构造的吗?另一种可能性是您不小心改变了现有对象而不是创建新对象。

于 2012-11-21T06:12:15.220 回答