Кнопка раскрытия деталей не отображается в представлении аннотаций

#iphone #mkmapview

#iPhone #mkmapview

Вопрос:

По какой-то странной причине кнопка detail почему-то перестала появляться:

 - (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation
{
MKPinAnnotationView *pinAnnotation = nil;
if(annotation != mapView.userLocation) 
{
    MKPinAnnotationView *pinAnnotation = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"sadasdasd"];
    if ( pinAnnotation == nil ){
        pinAnnotation = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"sadasdasd"] autorelease];

        /* add detail button */
        NSLog(@"Here");

        UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        pinAnnotation.rightCalloutAccessoryView = infoButton;


    }

}

return pinAnnotation;
}
  

Вот вывод.
Заранее спасибо.

Ответ №1:

Первая проблема заключается в том, что pinAnnotation она объявляется дважды в этом методе.

Один раз в первой строке и второй в if(annotation != mapView.userLocation)... блоке. Из-за этого return оператор возвращается nil , потому что внешняя переменная никогда не устанавливается (что приводит MKAnnotationView к выноске по умолчанию без принадлежности).

Измените второе объявление на просто назначение.

Следующая проблема заключается в том, что вам нужно установить canShowCallout YES значение, потому что по умолчанию используется NO значение an MKPinAnnotationView . Вы можете сделать это после настройки представления аксессуаров:

 pinAnnotation.canShowCallout = YES;
  

Вышеизложенное должно исправить то, что вспомогательная кнопка не отображается.

Не связано, но вам также необходимо установить свойство представления annotation при его повторном использовании (в случае, когда оно не равно нулю после удаления из очереди). Поэтому добавьте else блок в if (pinAnnotation == nil) :

 else {
    //annotation view being re-used, set annotation to current...
    pinAnnotation.annotation = annotation;
}