2016-08-30 25 views
8

更新2:添加多個註釋,以地圖,全部表現出一些相同的數據

這裏是地圖中現有的代碼,但它就像註釋讓所有無序與引腳。有一次,一個針腳會變成綠色,下次我跑它時,同樣的針腳變成紅色。斷開連接從哪裏來?

-(void) viewWillAppear:(BOOL)animated { 
    self.annotationArray = [[NSMutableArray alloc] init]; 

CLLocationCoordinate2D coord = {.latitude = 15.8700320, .longitude = 100.9925410}; 
MKCoordinateSpan span = {.latitudeDelta = 3, .longitudeDelta = 3}; 
MKCoordinateRegion region = {coord, span}; 
[mapViewUI setRegion:region]; 
    PFQuery *query = [PFQuery queryWithClassName:@"Share"]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
         self.mapViewData = objects; 
         for (int i=0;i<[objects count];i++) 
      { 
       // Question * q = [[Question alloc]init]; 

       PFObject * obj = [self.mapViewData objectAtIndex:i]; 
       NSLog(@"%@", obj); 
       self.theObject = obj; 

       NSString *string = obj[@"WhereAt"]; 


       NSArray *stringArray = [string componentsSeparatedByString: @","]; 

       CLLocationDegrees myLatitude = [[stringArray objectAtIndex:0] doubleValue]; 
       CLLocationDegrees myLongitude = [[stringArray objectAtIndex:1] doubleValue]; 
       CLLocationCoordinate2D coord2 = {.latitude = myLatitude, .longitude = myLongitude}; 
       NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
       dateFormatter.dateFormat = @"MMM dd, yyyy"; 

       MKPointAnnotation *annotation2 = [[MKPointAnnotation alloc] init]; 
       [annotation2 setCoordinate:coord2]; 
       [annotation2 setTitle:obj[@"FamilyName"]]; 
       [annotation2 setSubtitle:obj[@"Result"]]; 
       [mapViewUI addAnnotation:annotation2]; 


      } 


     } else { 
      // Log details of the failure 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 


    }]; 

} 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
    if (annotation == mapViewUI.userLocation) 
    { 
     return nil; 
    } 
    else 
    { 
    NSUInteger index = [[mapView annotations] indexOfObject:annotation]; 
    PFObject *objectForCurrentAnnotation = [self.mapViewData objectAtIndex:index]; 
    MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] init]; 

    annotationView.enabled = YES; 
    annotationView.canShowCallout = YES; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.dateFormat = @"MMM dd, yyyy"; 
    NSString *theResult = objectForCurrentAnnotation[@"Result"]; 
    NSLog(@"Result is %@", theResult); 

    if ([theResult isEqualToString:@"Accepted Bible"]) { 
     NSLog(@"Accepted"); 
     annotationView.pinTintColor = [UIColor greenColor]; 

    } 
    else if ([theResult isEqualToString:@"Requested Different Material"]) { 
     NSLog(@"Different"); 

     annotationView.pinTintColor = [UIColor blackColor]; 

    } 
    else if ([theResult isEqualToString:@"Not Home"]) { 
     NSLog(@"Not Home"); 

     annotationView.pinTintColor = [UIColor yellowColor]; 

    } 
    else if ([theResult isEqualToString:@"Rejected Bible"]) { 
     NSLog(@"Rejected"); 

     annotationView.pinTintColor = [UIColor redColor]; 

    } 



    return annotationView; 
    } 

    return nil; 
} 

UPDATE:

現在我看到的問題是,self.theObject設定一個時間,所以它只是從拉數據不被註解處理一切。我想現在的問題是,我怎樣才能讓它顯示每個對象,而不是最後一個對象?

我的應用使用Parse.com和PFObjects。應用程序查詢PFObject以獲取行中每個條目的所有數據,爲該條目的給定位置提取座標以及各種數據位,併爲每個數據添加註釋。當我爲此設置MKAnnotationView,以便可以在蘋果通常允許您輕鬆執行的操作之外擁有多個彩色引腳時,我遇到了問題。圖像和註釋的一些數據將每個引腳設置爲最後一個被調用的位置。標題和副標題都很好,但不是顏色或標註圖片。這裏是我的代碼,這裏發生了什麼問題?

-(void) viewWillAppear:(BOOL)animated { 
CLLocationCoordinate2D coord = {.latitude = 15.8700320, .longitude = 100.9925410}; 
MKCoordinateSpan span = {.latitudeDelta = 3, .longitudeDelta = 3}; 
MKCoordinateRegion region = {coord, span}; 
[mapView setRegion:region]; 
    PFQuery *query = [PFQuery queryWithClassName:@"Share"]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      NSLog(@"YAY"); 
      // The find succeeded. The first 100 objects are available in objects 
      // questionsList = [[NSMutableArray alloc]init]; 
      NSLog(@"Objects%lu", (unsigned long)[objects count]); 

      for (int i=0;i<[objects count];i++) 
      { 
       // Question * q = [[Question alloc]init]; 

       PFObject * obj = [objects objectAtIndex:i]; 
       self.theObject = obj; 

       NSString *string = obj[@"WhereAt"]; 


       NSArray *stringArray = [string componentsSeparatedByString: @","]; 

       CLLocationDegrees myLatitude = [[stringArray objectAtIndex:0] doubleValue]; 
       CLLocationDegrees myLongitude = [[stringArray objectAtIndex:1] doubleValue]; 
       CLLocationCoordinate2D coord2 = {.latitude = myLatitude, .longitude = myLongitude}; 
       NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
       dateFormatter.dateFormat = @"MMM dd, yyyy"; 
       NSString *theResult = obj[@"Result"]; 


       NSString *theDate = [dateFormatter stringFromDate:obj[@"DateVisited"]]; 
       NSString *combined = [[theResult stringByAppendingString:@" on "] stringByAppendingString:theDate]; 
       NSString *theTitle = [[obj[@"FamilyName"] stringByAppendingString:@" "] stringByAppendingString:obj[@"StreetAddress"]]; 

       MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; 
       [annotation setCoordinate:coord2]; 
       [annotation setTitle:theTitle]; 
       [annotation setSubtitle:combined]; 

       [mapView addAnnotation:annotation]; 

      } 


     } else { 
      // Log details of the failure 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
    }]; 



} 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 


    MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] init]; 

    annotationView.enabled = YES; 
    annotationView.canShowCallout = YES; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.dateFormat = @"MMM dd, yyyy"; 
    NSString *theResult = self.theObject[@"Result"]; 
    NSLog(@"Result is %@", theResult); 

    if ([theResult isEqualToString:@"Accepted Bible"]) { 
     // NSLog(@"Accepted"); 
     annotationView.pinTintColor = [UIColor greenColor]; 

    } 
    else if ([theResult isEqualToString:@"Requested Different Material"]) { 
     //NSLog(@"Different"); 

     annotationView.pinTintColor = [UIColor blackColor]; 

    } 
    else if ([theResult isEqualToString:@"Not Home"]) { 
     // NSLog(@"Not Home"); 

     annotationView.pinTintColor = [UIColor yellowColor]; 

    } 
    else if ([theResult isEqualToString:@"Rejected Bible"]) { 
     //NSLog(@"Rejected"); 

     annotationView.pinTintColor = [UIColor redColor]; 

    } 
    //annotationView.image = [UIImage imageNamed:@"arrest.png"];//here we use a nice image instead of the default pins 
    PFFile *thumbnail = self.theObject[@"HousePicture"]; 
    [thumbnail getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) { 

     UIImage *thumbnailImage = [UIImage imageWithData:imageData]; 
     self.theImage = thumbnailImage; 
     //annotationView.image = thumbnailImage; 
     UIView *leftCAV = [[UIView alloc] initWithFrame:CGRectMake(0,0,60,60)]; 
     UIImageView *theImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 60, 60)]; 
     theImageView.image = self.theImage; 
     annotationView.leftCalloutAccessoryView = leftCAV; 
     [leftCAV addSubview:theImageView]; 
     annotationView.canShowCallout = YES; 

    }]; 


    return annotationView; 


    return nil; 
} 

回答

0

子類MKPointAnnotation例如MyPointAnnotation添加屬性result

@interface MyPointAnnotation : MKPointAnnotation 
    @property (nonatomic, strong) NSString *result; 
@end 

viewWillAppear:修改這些行

NSString *theResult = obj[@"Result"]; 

MyPointAnnotation *myAnnotation = [[MyPointAnnotation alloc] init]; 
[myAnnotation setCoordinate:coord2]; 
[myAnnotation setTitle:theTitle]; 
[myAnnotation setSubtitle:combined]; 
[myAnnotation setResult:theResult]; 

[mapView addAnnotation:myAnnotation]; 

viewForAnnotation:委託方法得到這樣

0,結果
0

你可以用幾種不同的方法解決這個問題。

1. MKMapView類有屬性稱爲註釋。通過調用這個屬性,它會返回您映射中所有註釋的排序數組,這與您的初始數組中的數據順序有關。通過這種方式,您只需存儲Parse中的所有提取的對象。 在您的視圖控制器的接口只需添加一個新的屬性:

@property (nonatomic, string) NSArray *mapViewData; 

在你viewWillAppear方法:

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      if (!error) { 
       self.mapViewData = objects; 
       // here you form your annotations 
      } 
    }]; 

然後,只需拉委託方法

- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
    NSUInteger index = [[mapView annotations] indexOfObject:annotation]; 
    PFObject *objectForCurrentAnnotation = [self.mapViewData objectAtIndex:index]; 
    // do your customisation 
} 

2此數據。 重寫和子類MKPointAnnotation對象。

@interface SuperAnnotation : MKPointAnnotation 

@property (nonatomic, strong) PFObject *dataObject; 

@end 

@implementation SuperAnnotation 

- (void)setDataObject:(PFObject *)dataObject { 
    _dataObject = dataObject; 

    self.title = // calculate your string for title 
    self.subtitle = // and the same for subtitle 
} 

@end 

然後在委託方法只是得到註釋對象這個對象和你想

- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
    PFObject *objectForCurrentAnnotation = ((SuperAnnotation *) annotation).dataObject;  
    // do your customisation 
} 

3什麼。 您可以創建字典來存儲您需要定製的MKAnnotation和PFObject對(不建議用於大數據量)。

@property (nonatomic, string) NSMutableDictionary *dataDictionary; 
viewWillAppear:

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      self.dataDictionary = [NSMutableDictionary new]; 
      // here you form your annotations 

      [self.dataDictionary setObject:yourPFObject forKey:yourAnnoationObject]; 
     } 
}]; 

然後

再次拉的數據代表:

- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
    PFObject *objectForCurrentAnnotation = [self.dataDictionary objectForKey:annotation]; 
    // do your customisation 
} 
+0

我已經出城,並剛回來嘗試選項#1你寫。但是,我仍然有一些困難。它現在顯示不同的顏色,但它並不總是匹配正確的位置。例如,如果結果是接受聖經,我會告訴它做綠色。地圖註釋會在字幕上正確地說它是Accepted Bible,但顏色會顯示被拒絕。 – user717452

+0

@ user717452嘗試方法編號2. –

+0

@ user717452你是指什麼顏色被拒絕? –