2015-03-27 18 views
5

Quando si tenta di conformarsi al protocollo MKAnnotation, l'errore di lancio della classe non è conforme al protocollo MKAnnotation. Sto usando il seguente codiceImpossibile eseguire il protocollo MKAnnotation in Swift

import MapKit 
import Foundation 

class MyAnnotation: NSObject, MKAnnotation 
{ 

} 

La stessa cosa è possibile con Objective-C.

+0

Dai un'occhiata a questo link, il stesso numero http://stackoverflow.com/questions/24233873/mkannotation-swift –

risposta

10

è necessario implementare seguente richiesto nei bandi:

class MyAnnotation: NSObject, MKAnnotation { 
    var myCoordinate: CLLocationCoordinate2D 

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

    var coordinate: CLLocationCoordinate2D { 
     return myCoordinate 
    } 
} 
+0

Come accennato, ho implementato la proprietà coordiante anche se sto ricevendo errore. Se hai qualche codice demo per favore condividi. Grazie classe MyAnnotation: NSObject, MKAnnotation {coordinare var: CLLocationCoordinate2D {} ottenere } –

+0

ho cambiato il codice per essere più precisi. – Abdullah

+0

Rimuovi la dichiarazione 'var coordinate: ...' sopra la definizione 'class ...'. Ciò causerà solo un errore del compilatore e confonderà le persone. È anche una buona pratica, almeno negli esempi, implementare anche 'title' e' sottotitoli' anche se sono "opzionali" (il titolo sarà quasi sempre necessario). – Anna

2

In Swift, è necessario implementare ogni variabili e metodi di un protocollo non opzionali al fine di conformarsi ad un protocollo. In questo momento, la tua classe è vuota, il che significa che ora non è conforme al protocollo MKAnnotation. Se si guarda alla declaraton di 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) 
} 

si può vedere, che se si sceglie di implementare almeno la variabile coordinate, poi si conformi al protocollo.

1

Ecco una versione più semplice:

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

Non è necessario definire una proprietà in più var myCoordinate: CLLocationCoordinate2D come la risposta accettata.

0

alternativa (lavora a Swift 2.2, Xcode 7.3.1) (Nota:. Swift non fornisce auto-notifiche, così ho gettare il mio) -

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

grazie per il codice di esempio. Sospetto la mia domanda qui: http://stackoverflow.com/questions/39273459/ios-mkmapview-custom-images-display-on-top-left-corner è relativo a KVO. ma come può mapView osservare il cambio di coordinate e ridisegnare l'interfaccia utente? – cooltch

Problemi correlati