2016-08-30 39 views
8

UPDATE 2:Dodawanie wielu adnotacje na mapie, ale wszystkie Pokaż Niektóre z tych samych danych

Oto istniejący kod zasięgu map, ale to jest jak adnotacje dostać wszystko w porządku z kołkami. Jeden raz pinezka będzie zielona, ​​a po następnym uruchomieniu ta sama pinezka będzie czerwona. Skąd się bierze rozłączenie?

-(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:

Teraz widzę, że problem jest to, że self.theObject ustawiony jest jeden raz, więc to po prostu pobiera dane z tego wszystkiego nie obsługiwane przez adnotacji. Chyba teraz chodzi o to, jak mogę go pokazać dla każdego obiektu zamiast tego, co był ostatnim zestawem?

Moja aplikacja korzysta z Parse.com i PFObjects. Aplikacja zapytuje PFObject, aby uzyskać wszystkie dane dla każdego wpisu w wierszu, wyciąga współrzędne dla danej lokalizacji dla tego wpisu, wraz z różnymi bitami danych i dodaje adnotację dla każdego z nich. Kiedy ustawiam MKAnnotationView dla tego, abym mógł mieć wiele kolorowych pinezek poza tym, co Apple zazwyczaj pozwala ci łatwo zrobić, napotykam problemy. Obraz i niektóre dane do adnotacji ustawiają każdą pinezkę na dowolną ostatnią wywołaną. Tytuł i podtytuł są w porządku, ale nie obraz koloru ani objaśnienia. Oto mój kod, co tu jest nie tak?

-(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; 
} 

Odpowiedz

0

Podklasa MKPointAnnotation np MyPointAnnotation dodać obiekt result

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

W viewWillAppear: modyfikować te linie

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

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

[mapView addAnnotation:myAnnotation]; 

W viewForAnnotation: metody delegata uzyskać wynik takiego

MyPointAnnotation *myAnnotation = (MyPointAnnotation *)annotation; 
NSString *theResult = myAnnotation.result; 
0

Możesz rozwiązać ten problem na kilka różnych sposobów.

1. MKMapView klasa ma właściwość o nazwie adnotacje. Przez wywołanie tej właściwości zwróci ona posortowaną tablicę wszystkich adnotacji na mapie, która jest powiązana z kolejnością danych w początkowej tablicy. W ten sposób po prostu musisz przechowywać wszystkie sprowadzone obiekty z analizy. W interfejsie w kontrolerze widoku wystarczy dodać nową właściwość:

@property (nonatomic, string) NSArray *mapViewData; 

W swojej metodzie viewWillAppear:

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

Następnie wystarczy wyciągnąć te dane w metodzie delegata

- (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. Zastępuje i podklasuje obiekt 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 

A następnie w metodzie delegata prostu ten obiekt z obiektem adnotacji i rób co chcesz

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

3. Można utworzyć słownik, w którym będą przechowywane pary MKAnnotation i PFObject, które są potrzebne do dostosowania (niezalecane w przypadku dużej ilości danych).

@property (nonatomic, string) NSMutableDictionary *dataDictionary; 

w viewWillAppear:

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

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

A potem jeszcze raz wyciągnąć dane w delegata:

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

byłem poza miastem i właśnie wróciłem do wypróbowania Option # 1 napisał . Jednak wciąż mam pewne trudności. Teraz pokazuje różne kolory, ale nie zawsze pasuje do prawidłowych lokalizacji. Na przykład mówię, żeby zrobiło się zielone, jeśli wynikiem jest Zaakceptowana Biblia. Adnotacja na mapie poprawnie powie w podtytule, że została zaakceptowana, ale kolor zostanie odrzucony. – user717452

+0

@ user717452 spróbuj numer metody 2. –

+0

@ user717452 co masz na myśli, że kolor został odrzucony? –