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