ViewForAnnotation在iPad 6.0模拟器中工作,但在iPad 5.1模拟器中不起作用

时间:2012-11-15 15:06:33

标签: ios ios5 ios6 mkmapview mkannotationview

我开始使用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中无效,代码相同

3 个答案:

答案 0 :(得分:4)

我很惊讶地听到viewForAnnotation只是在每次施工后都被召唤过来。它不是记录的方式,也不是其他人使用的方式。 viewForAnnotation可以并且将在您的应用中随时调用。如果用户滚动地图以使某些注释消失,则可以在它们向后滚动地图并再次显示注释时调用它。或者,如果用户切换到另一个视图或应用程序,然后返回。

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

答案 1 :(得分:1)

当您在循环中运行时(例如,当您添加每个viewForAnnotation时),

MKAnnotation未被调用,因为您位于主runLoop上。当您viewDidLoad完成并发生runLoop周期后,MKAnnotation s(当前地图位置上的那些)将在屏幕上绘制,从而呼叫您的delegate。因此,当您调试并单步执行viewDidLoad时,您没有看到delegate方法的调用是完全正常的。

有几件事:

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

  • 您正在重复使用i作为for...loop变量。我希望这只是因为您删除了在此处发布的业务逻辑而不是在您的实际代码中。它可以解释为什么只显示最后一组注释。

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

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

答案 2 :(得分:1)

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

if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone)

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