2014-10-30 4 views
2

я создал минимальный пользовательский 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; это проблематично только аннотация.

+0

Интересно, что аннотация _does_ появляется в 'map.annotationsInMapRect (map.visibleMapRect)' (пока она находится внутри этого 'visibleMapRect', конечно), которая возвращает' NSSet'. Полагаю, это имеет смысл, поскольку «MKMapView», вероятно, использует это, чтобы определить, какие аннотации отображать, а аннотации отображаются на карте. –

ответ

1

Это, должно быть, было ошибкой в ​​Свифт в момент написания вопроса, потому что теперь (Xcode 6.3) проблема исчезла - проблема исправлена.

Смежные вопросы