2013-10-05 1 views
0

Я обновил отлично работающее приложение 6.1 к Xcode 5/ios 7 , которое использует MKMapKit для отображения некоторых контактов на карте.ios 7 pin viewforannotation не отображается

Теперь аннотации не отображаются. Ive убедился, что мой делегат mapview является правильным и viewForAnnotation вызывается. Im также уверен, что его название и субтитры установлены, но теперь штырь просто не показывает дисплей. У кого-нибудь есть идеи, что искать дальше?

Когда он работает, я вижу мой широта/долгота, контактный заголовок и подзаголовок заполнены

Heres мой код:.

- (MKAnnotationView *) mapView:(MKMapView *) theMapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     return nil; 
    } 

    [self.mapView removeAnnotations:self.mapView.annotations]; 

    MKPointAnnotation *pt = (MKPointAnnotation *)annotation; 

    NSString *PINNAME = pt.title; 
    CLLocationDegrees lat = pt.coordinate.latitude; 
    CLLocationDegrees lon = pt.coordinate.longitude; 
    [Log log:TINFO :@"lat/lon %f - %f", lat, lon]; 
    [Log log:TINFO :@"pin title userid = %@", pt.title]; 
    [Log log:TINFO :@"subtitle: %@", pt.subtitle]; 

    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier: PINNAME]; 

    if(pinView == nil) 
    { 
     pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:PINNAME]; 
     pinView.pinColor = MKPinAnnotationColorGreen; 
    } 
    else 
    { 
     pinView.annotation = annotation; 
    } 

    return pinView; 
} 

ответ

3

Вы должны удалить вызов removeAnnotations из viewForAnnotation, потому что наличие там будут удалены любые аннотации, которые вы, возможно, находили в процессе отображения на карте. Если вы хотите удалить старые аннотации перед добавлением нового, вы должны сделать это, прежде чем звонить addAnnotation, а не в viewForAnnotation.

Unrelated к текущему вопросу:

  1. И даже если вы действительно хотите, чтобы удалить все аннотаций, если это возможно, что вы могли бы (в какой-то момент) имеют MKUserLocation на вашей карте, я бы предлагайте только удаление аннотаций, где класс аннотации не равен MKUserLocation. Я заметил странное поведение, когда случайно удалил MKUserLocation из массива annotations.

  2. В качестве альтернативы, я мог бы предложить использовать параметр theMapView, а не self.mapView. Вы не хотите рисковать проблемами, связанными с перепутанным IBOutlet. Нет необходимости ссылаться на self.mapView, когда в качестве параметра был принят theMapView.

  3. Возможно, вы используете уникальный identifier для каждого MKAnnotationView. Нет ничего, что я вижу в этом коде, что требует этого, и вы теряете большую часть эффективности, получаемой при использовании аннулированных аннотаций. Используйте ту же строку identifier для всех представлений аннотаций определенного типа (и у вас только один вид аннотации).

+1

Спасибо за указатели Роба. Хорошая вещь. Я думаю, что Im неправильно понимает уникальные идентификаторы в этом случае. Если вы используете, давайте скажем «thePin» в качестве идентификатора, и вы ставите многие из них, как «viewForAnnotation» знает, какой вывод для удаления? Я тоже так хорошо знаком с настольной работой, так что теперь мне любопытно. – Tim

+0

@Tim Это отличает любые булавки, которые прокручиваются вне поля зрения. Это аналогично идентификатору ячейки для 'UITableViewCell'. Один идентификатор для всех похожих похожих аннотаций. – Rob

+0

Кажется, у меня были removeAnnotations в плохом месте, которое не кусало меня до сих пор. Я также обнаружил, что когда я вызываю [self.mapView removeAnnotations: self.mapView.annotations]; а затем добавить новые аннотации, оба набора аннотаций все еще находятся на карте. Очень странно. – Tim

3
- (MKAnnotationView *)mapView:(MKMapView *)mv viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    //UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"ttile" message:@"working" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil]; 
    //[alert show]; 
    MKAnnotationView *view = nil; 
    if(annotation != mv.userLocation) { 
     // if it's NOT the user's current location pin, create the annotation 
     Park *parkAnnotation = (Park*)annotation; 
     // Look for an existing view to reuse 
     view = [mv dequeueReusableAnnotationViewWithIdentifier:@"parkAnnotation"]; 
     // If an existing view is not found, create a new one 
     if(view == nil) { 
      view = [[MKPinAnnotationView alloc] initWithAnnotation:(id) parkAnnotation 
                reuseIdentifier:@"parkAnnotation"]; 
     } 

     // Now we have a view for the annotation, so let's set some properties 
     [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorRed]; 
     [(MKPinAnnotationView *)view setAnimatesDrop:YES]; 
     [view setCanShowCallout:YES]; 

     // Now create buttons for the annotation view 
     // The 'tag' properties are set so that we can identify which button was tapped later 
     UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeInfoLight]; 
     leftButton.tag = 0; 
     UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     rightButton.tag = 1; 

     // Add buttons to annotation view 
     [view setLeftCalloutAccessoryView:leftButton]; 
     [view setRightCalloutAccessoryView:rightButton]; 
    } 

    // send this annotation view back to MKMapView so it can add it to the pin 
    return view; 
}