2015-03-27 20 views
5

Kiedy próbuję dopasować protokół MKAnnotation, zgłaszam błąd, moja klasa nie jest zgodna z protokołem MKAnnotation. Korzystam z następującego kodu:Nie można zastosować protokołu MKAnnotation w Swift

import MapKit 
import Foundation 

class MyAnnotation: NSObject, MKAnnotation 
{ 

} 

To samo jest możliwe w Objective-C.

+0

Check out this powiązań, ten sam numer: http://stackoverflow.com/questions/24233873/mkannotation-swift –

Odpowiedz

10

Trzeba wdrożyć następujące wymagane właściwości w zaproszeniach:

class MyAnnotation: NSObject, MKAnnotation { 
    var myCoordinate: CLLocationCoordinate2D 

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

    var coordinate: CLLocationCoordinate2D { 
     return myCoordinate 
    } 
} 
+0

Jak już wspomniano, zaimplementowałem właściwość coordiante, mimo że dostaję błąd. Jeśli masz jakiś kod demo, udostępnij. Dzięki klasa MyAnnotation: NSObject, MKAnnotation {var współrzędnych: CLLocationCoordinate2D {get} } –

+0

Zmieniłem kod, aby być bardziej precyzyjny. – Abdullah

+0

Usuń deklarację 'var coordinate: ...' powyżej definicji 'class ... '. To tylko spowoduje błąd kompilatora i wprowadzi w błąd ludzi. Lepszą praktyką, przynajmniej w przykładach, jest także implementacja "tytułu" i "podtytułu", mimo że są "opcjonalne" (tytuł prawie zawsze będzie potrzebny). – Anna

2

w Swift, trzeba wdrożyć co non-opcjonalne zmienne i metody protokołu, w celu dostosowania się do protokołu. W tej chwili twoja klasa jest pusta, co oznacza, że ​​nie jest ona zgodna z protokołem. Jeśli spojrzeć na declaraton z 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) 
} 

widać, że jeśli wdrożenie przynajmniej zmienną coordinate, to zgodne z protokołem.

1

Oto prostsza wersja:

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

Nie trzeba zdefiniować dodatkową właściwość var myCoordinate: CLLocationCoordinate2D jako zaakceptowanej odpowiedzi.

0

Alternatywnie (działa w Swift 2.2, Xcode 7.3.1). (Uwaga: Swift nie przewiduje automatycznych powiadomień, więc rzucam na własną rękę) -

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

dzięki za przykładowy kod. Podejrzewam tu moje pytanie: http://stackoverflow.com/questions/39273459/ios-mkmapview-custom-images-display-on-top-left-corner jest związany z KVO. ale w jaki sposób mapView może obserwować zmianę współrzędnych i przerysować interfejs użytkownika? – cooltch