Обратите внимание, что ваше сообщение говорит, что это MKAnnotationView
. Это потому, что вы зарегистрировали MKAnnotationView
для своего идентификатора, а не MKMarkerAnnotationView
. Вы хотите:
[self.cafeMap registerClass:[MKMarkerAnnotationView class] forAnnotationViewWithReuseIdentifier:@"marker"];
Кроме того, вы должны иметь возможность упростить viewForAnnotation
до:
MKAnnotationView *marker = [mapView dequeueReusableAnnotationViewWithIdentifier:@"marker" forAnnotation:annotation];
Лично я перенесу конфигурацию представления аннотации в свой собственный подкласс:
static NSString * const cafeClusteringIdentifier = @"cafe";
@interface CafeAnnotationView: MKMarkerAnnotationView
@end
@implementation CafeAnnotationView
- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoLight];
self.rightCalloutAccessoryView = button;
self.canShowCallout = true;
self.clusteringIdentifier = cafeClusteringIdentifier;
}
return self;
}
- (void)setAnnotation:(id<MKAnnotation>)annotation {
[super setAnnotation:annotation];
self.clusteringIdentifier = cafeClusteringIdentifier;
}
@end
Делая это, я избегаю вздутия моего контроллера представления кодом для настройки представлений аннотаций.
Обратите внимание, я настраиваю clusteringIdentifier
, чтобы вы наслаждались этим поведением MKMarkerAnnotationView
.
И тогда я зарегистрирую этот класс для MKMapViewDefaultAnnotationViewReuseIdentifier
:
[self.cafeMap registerClass:[CafeAnnotationView class] forAnnotationViewWithReuseIdentifier:MKMapViewDefaultAnnotationViewReuseIdentifier];
Преимущество использования MKMapViewDefaultAnnotationViewReuseIdentifier
заключается в том, что вам совсем не нужно вводить viewForAnnotation
. Удалите вашу реализацию этого метода полностью. В iOS 11 и более поздних версиях вам нужно реализовать viewForAnnotation
, только если вам нужно сделать что-то особенное, например, иметь несколько пользовательских идентификаторов повторного использования для нескольких типов аннотаций.
В любом случае, это дает: