2015-03-27 3 views
5

Когда я пытаюсь согласовать протокол MKAnnotation, он бросает ошибку, мой класс не соответствует протоколу MKAnnotation. Я использую следующий кодНевозможно согласовать протокол MKAnnation в Swift

import MapKit 
import Foundation 

class MyAnnotation: NSObject, MKAnnotation 
{ 

} 

То же самое можно сделать с Objective-C.

+0

проверить это ссылка, то тот же выпуск http://stackoverflow.com/questions/24233873/mkannotation-swift –

ответ

10

Необходимо реализовать следующее требуемое свойство в вызовах:

class MyAnnotation: NSObject, MKAnnotation { 
    var myCoordinate: CLLocationCoordinate2D 

    init(myCoordinate: CLLocationCoordinate2D) { 
     self.myCoordinate = myCoordinate 
    } 

    var coordinate: CLLocationCoordinate2D { 
     return myCoordinate 
    } 
} 
+0

Как вы упомянули, я реализовал свойство согласования, хотя я получаю ошибку. Если у вас есть демо-код, поделитесь им. Благодаря класс MyAnnotation: NSObject, MKAnnotation { вар координат: CLLocationCoordinate2D {} получить } –

+0

Я изменил код, чтобы быть более точным. – Abdullah

+0

Удалить определение 'var координат: ...' над определением 'class ... '. Это просто вызовет ошибку компилятора и смутит людей. Также лучше, по крайней мере, в примерах также реализовать «title» и «subtitle», даже если они «необязательны» (название почти всегда будет необходимо). – Anna

2

В Swift, вы должны выполнять каждый без дополнительных переменных и методов протокола для того, чтобы соответствовать протоколу. Сейчас ваш класс пуст, а это значит, что теперь он не соответствует протоколу MKAnnotation. Если вы посмотрите на declaraton из MKAnnotation:

protocol MKAnnotation : NSObjectProtocol { 

    // Center latitude and longitude of the annotation view. 
    // The implementation of this property must be KVO compliant. 
    var coordinate: CLLocationCoordinate2D { get } 

    // Title and subtitle for use by selection UI. 
    optional var title: String! { get } 
    optional var subtitle: String! { get } 

    // Called as a result of dragging an annotation view. 
    @availability(OSX, introduced=10.9) 
    optional func setCoordinate(newCoordinate: CLLocationCoordinate2D) 
} 

вы можете увидеть, что если реализовать, по крайней мере переменную coordinate, то соответствовать протоколу.

1

Вот упрощенная версия:

class CustomAnnotation: NSObject, MKAnnotation { 
    init(coordinate:CLLocationCoordinate2D) { 
     self.coordinate = coordinate 
     super.init() 
    } 
    var coordinate: CLLocationCoordinate2D 
} 

Вам не нужно определить дополнительное свойство var myCoordinate: CLLocationCoordinate2D как принято отвечать.

0

В качестве альтернативы (работает в Swift 2.2, Xcode 7.3.1). (Примечание: Swift не обеспечивает авто-уведомление, так что я бросить в моем собственном) -

import MapKit 

class MyAnnotation: NSObject, MKAnnotation { 

// MARK: - Required KVO-compliant Property 
var coordinate: CLLocationCoordinate2D { 
    willSet(newCoordinate) { 
     let notification = NSNotification(name: "MyAnnotationWillSet", object: nil) 
     NSNotificationCenter.defaultCenter().postNotification(notification) 
    } 

    didSet { 
     let notification = NSNotification(name: "MyAnnotationDidSet", object: nil) 
     NSNotificationCenter.defaultCenter().postNotification(notification) 
    } 
} 


// MARK: - Required Initializer 
init(coordinate: CLLocationCoordinate2D) { 
    self.coordinate = coordinate 
} 
+0

спасибо за образец кода. Я подозреваю, что мой вопрос здесь: http://stackoverflow.com/questions/39273459/ios-mkmapview-custom-images-display-on-top-left-corner связан с KVO. но как mapView может наблюдать изменение координат и перерисовку пользовательского интерфейса? – cooltch

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