я создал минимальный пользовательский MKAnnotation в Swift:Пользовательские MKAnnotation в Swift не добавляются аннотации МАП
import UIKit
import MapKit
class MyAnnotation : NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String = ""
var subtitle: String = ""
init(location coord:CLLocationCoordinate2D) {
self.coordinate = coord
super.init()
}
}
И я добавить его к моему MKMapView обычным способом:
let ann = MyAnnotation(location:self.annloc)
self.map.addAnnotation(ann)
аннотаций появляется на карте. (У меня также есть пользовательский MKAnnotationView, но это не имеет значения.) Но есть проблема; аннотация на самом деле не существует. Под этим я подразумеваю, что когда я запрашиваю массив аннотаций карты, self.map.annotations
, он пуст.
Это, по-видимому, проблема с Swift. Если я заменил MyAnnotation реализацией Objective-C, изменив ничего, кроме о моем проекте, он отлично работает! Это MyAnnotation показывает вверх в self.map.annotations
, как и ожидалось:
// === .h file:
#import <Foundation/Foundation.h>
@import MapKit;
@interface MyAnnotation : NSObject <MKAnnotation>
@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title, *subtitle;
- (id)initWithLocation:(CLLocationCoordinate2D)coord;
@end
// === .m file:
#import "MyAnnotation.h"
@implementation MyAnnotation
- (id)initWithLocation: (CLLocationCoordinate2D) coord {
self = [super init];
if (self) {
self->_coordinate = coord;
}
return self;
}
@end
Проблема является неясным один, и вы можете использовать пользовательские MKAnnotation написанный на Swift, не понимая, что есть какие-либо проблемы. Но проблема реальна и может вызвать проблемы в будущем.
Так что мы знаем очень ясно, что MKAnnotation, написанная в Swift, не работает, и то же самое MKAnnotation, написанное в Objective-C. Вопрос в том, почему? И во-вторых: можем ли мы что-нибудь сделать? Можно ли написать MKAnnotation в чистом Swift, который будет правильно отображаться в массиве annotations
?
Я предполагаю, что проблема связана либо с KVC, либо с чем-то связанным с тем, что, давайте посмотрим правде в глаза, объект Swift просто не совсем то же самое, что объект Objective-C. Я попробовал добавить различные KVC-подобные функции, dynamic
и т. Д. В мою Swift версию MKAnnotation, но ничего не помогает.
EDIT: Я поставил тестовую GitHub проект:
https://github.com/mattneub/MKAnnotation-Swift
Это добавляет две аннотации, один написанный в Objective-C, а другой написанный на Свифта, а затем регистрирует self.map.annotations
. Один из них не появляется! Еще страннее; есть запятая. Это как если бы объект не был реальным объектом. Или что-то.
Кроме того, у меня нет проблем с пользовательским наложением в Swift; это проблематично только аннотация.
Интересно, что аннотация _does_ появляется в 'map.annotationsInMapRect (map.visibleMapRect)' (пока она находится внутри этого 'visibleMapRect', конечно), которая возвращает' NSSet'. Полагаю, это имеет смысл, поскольку «MKMapView», вероятно, использует это, чтобы определить, какие аннотации отображать, а аннотации отображаются на карте. –