2013-05-02 3 views
1

Я пытаюсь показать информацию на карте от json, но ничего не происходит. Я думаю, что что-то не хватает, поэтому информация может быть показана на карте. . Управляйте работой json и получаете информацию о журнал, теперь я хотел бы знать, кто должен создать nsdictionary и массив, чтобы я мог показать тогда информацию на карте. Вот война, я до сих пор с массивом:json аннотации не отображаются на mapview

NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:@"URL"]]; 

NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

NSLog(@"Datos Obtenidos:\n%@",dict); 
NSDictionary *cortes; 
NSError* error; 
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data 
                options:kNilOptions 
                 error:&error]; 
NSMutableArray *jsonCheckins = [NSMutableArray array]; 
for(NSDictionary *jsonElement in jsonArray){ 
    InitViewController *checkin = [InitViewController checkinFromDictionary:jsonElement]; 
    [jsonCheckins addObject:checkin]; 
} 

Управление, чтобы добавить этот код, но до сих пор информация не showning на MapView:

- (CLLocationCoordinate2D) checkinCoordinate { 
    CLLocationCoordinate2D coordinate; 
    coordinate.latitude = self.checkin.latitud; 
    coordinate.longitude = self.checkin.longitud; 
    return coordinate;} 

- (void)showCheckinAnnotation { 
MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init]; 
annotationPoint.coordinate = [self checkinCoordinate]; 
annotationPoint.title = self.checkin.type; 
annotationPoint.subtitle = self.checkin.description; 
[self.mapView addAnnotation:annotationPoint];} 

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
MKAnnotationView *annotationView= nil; 
if(annotation != mapView.userLocation) { 
static NSString *annotationViewId = @"annotationViewId"; 
annotationView = (MKAnnotationView *)[mapView   
dequeueReusableAnnotationViewWithIdentifier:annotationViewId]; 
if (annotationView == nil) { 
    annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationViewId]; 
     } 
    } 
return annotationView;} 
+0

Вы уверены, что линия addAnnotation выполняется и что координаты верны? Также обратите внимание, что вы создаете простой MKAnnotationView, который по умолчанию пуст, если вы не добавляете контент или не устанавливаете изображение.Попробуйте создать MKPinAnnotationView или просто полностью удалите метод viewForAnnotation, чтобы получить представление по умолчанию. – Anna

+0

Согласовано, 'MKPinAnnotationView' была ключевой проблемой, но в вашей' viewForAnnotation' была еще одна небольшая проблема, где, если 'dequeueReusableAnnotationViewWithIdentifier' удалось, вы никогда не устанавливали аннотацию. Кроме того, вы не делитесь 'checkinFromDictionary', но ваши другие методы используют' self.checkin', но вы никогда не устанавливаете это ('checkin' является локальной переменной вашего первого метода, поэтому, надеюсь, это не то, что вы имели в виду, потому что это выиграло работа). – Rob

ответ

2

Мы не видим свой checkinFromDictionary, поэтому нам сложно комментировать, потому что мы никогда не увидим, что вы установили это свойство self.checkin, но это волнует. Но нам нужно будет увидеть больше кода, чтобы прокомментировать это.

Но, просто чтобы продемонстрировать, вот метод, который смотрит вверх и добавляет все аннотации без происшествий:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.buenosairescortes.com.ar/capitalfederalcortes/getCortes.php"]]; 

NSError *error; 
NSArray *array = [NSJSONSerialization JSONObjectWithData:data 
               options:0 
                error:&error]; 

if (error) 
{ 
    NSLog(@"%s: error=%@", __FUNCTION__, error); 
    return; 
} 

for (NSDictionary *dictionary in array) 
{ 
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; 
    annotation.coordinate = CLLocationCoordinate2DMake([dictionary[@"latitude"] doubleValue], 
                 [dictionary[@"longitude"] doubleValue]); 
    annotation.title = dictionary[@"type"]; 
    annotation.subtitle = dictionary[@"description"]; 
    [self.mapView addAnnotation:annotation]; 
} 

(Кстати, я использую CLLocationCoordinate2dMake метод, который является частью CoreLocation.framework, но вы, вероятно, тоже можете использовать свой метод.)

С точки зрения вашего viewForAnnotation, это кажется ненужным, поскольку вы, кажется, не делаете ничего, что бы он не делал по умолчанию. Но давайте предположим на секунду, что вы этого хотели (потому что, возможно, вы планируете дальнейшую настройку метода).

Есть две проблемы с вашей предоставленной рутина:

  • Вы создаете MKAnnotationView, который ничего не делать, если вы установите его image (или подкласс в классе, который устанавливает его image). Если вам нужен только стандартный вывод, используйте вместо него MKPinAnnotationView.

  • Более тонкая проблема заключается в том, что если аннотация аннулируется успешно, вы не сбрасываете ее аннотацию. Итак, я бы предложил включить предложение else в этот оператор if (annotation == nil).

Таким образом, что урожайность:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKAnnotationView *annotationView= nil; 
    if (![annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     static NSString *annotationViewId = @"annotationViewId"; 
     annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationViewId]; 
     if (annotationView == nil) 
     { 
      annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationViewId]; 
     } 
     else 
     { 
      annotationView.annotation = annotation; 
     } 
    } 
    return annotationView; 
} 

Этот метод также проверяет, является ли класс аннотаций не является членом через

if (![annotation isKindOfClass:[MKUserLocation class]]) 
{ 
    // do annotation stuff here 
} 

вместо

if (annotation != mapView.userLocation) 
{ 
    // do annotation stuff here 
} 

Эта это метод, который Apple описывает в их Location Awareness Programming Guide, так что это, вероятно, безопаснее. В общем, нецелесообразно проверять равенство между двумя объектами (возможно, вам повезло здесь, но это обычно не разумно). Объекты, которые поддерживают операции сравнения, обычно имеют методы равенства с префиксом isEqual. Сказав это, достаточно проверить членство в классе.

+0

Благодаря Робу, который отлично справился с последним, как мне создать описание, как только вы нажмете аннотацию, и как мне изменить контакт на пользовательский образ? заранее заблаговременно – darkjuso

+0

@ user2259545 Чтобы отобразить выноски, добавьте строку в свой 'viewForAnnotation', который говорит' annotationView.canShowCallout = YES; '. Чтобы изменить свой контакт на пользовательский образ, вы используете 'MKAnnotationView' вместо' MKPinAnnotationView', но просто убедитесь, что вы установите для параметра 'annotationView.image' ваше изображение, например. 'annotationView.image = [UIImage imageNamed: @" myimage.png "];'. – Rob

+1

спасибо, что все отлично работает – darkjuso

Смежные вопросы