2015-03-27 15 views
5

Khi tôi cố gắng tuân thủ giao thức MKAnnotation, nó ném lỗi lớp học của tôi không tuân theo giao thức MKAnnotation. Tôi đang sử dụng đoạn mã sauKhông thể tuân thủ giao thức MKAnnotation trong Swift

import MapKit 
import Foundation 

class MyAnnotation: NSObject, MKAnnotation 
{ 

} 

Điều tương tự cũng có thể với Objective-C.

+0

Check-out này liên kết, các cùng một vấn đề http://stackoverflow.com/questions/24233873/mkannotation-swift –

Trả lời

10

Bạn cần phải thực hiện bất động sản đòi hỏi sau đây trong các cuộc gọi:

class MyAnnotation: NSObject, MKAnnotation { 
    var myCoordinate: CLLocationCoordinate2D 

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

    var coordinate: CLLocationCoordinate2D { 
     return myCoordinate 
    } 
} 
+0

Như bạn đã đề cập, tôi đã triển khai thuộc tính phối hợp mặc dù tôi gặp lỗi. Nếu bạn có bất kỳ mã demo nào, hãy chia sẻ. Cảm ơn lớp MyAnnotation: NSObject, MKAnnotation {var phối hợp: CLLocationCoordinate2D {get} } –

+0

Tôi đã thay đổi mã để được chính xác hơn. – Abdullah

+0

Xóa khai báo 'var coordinate: ...' trên định nghĩa 'class ...'. Điều đó sẽ chỉ gây ra lỗi biên dịch và gây nhầm lẫn cho mọi người. Nó cũng là thực hành tốt hơn, ít nhất là trong các ví dụ, cũng để thực hiện 'title' và' subtitle' mặc dù chúng là "tùy chọn" (tiêu đề sẽ hầu như luôn luôn là cần thiết). – Anna

2

Trong Swift, bạn phải thực hiện tất cả các biến và phương pháp của một giao thức không bắt buộc theo thứ tự để phù hợp với một giao thức. Ngay bây giờ, lớp học của bạn trống, có nghĩa là bây giờ nó không phù hợp với giao thức thw MKAnnotation. Nếu bạn nhìn vào tờ khai của 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) 
} 

bạn có thể thấy, rằng nếu bạn thực hiện ít nhất là biến coordinate, sau đó bạn phù hợp với các giao thức.

1

Đây là một phiên bản đơn giản:

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

Bạn không cần phải xác định một tài sản var myCoordinate: CLLocationCoordinate2D thêm là câu trả lời chấp nhận.

0

Ngoài ra (chỉ hoạt động trong Swift 2.2, Xcode 7.3.1) (Lưu ý:. Swift không cung cấp tính năng tự động thông báo, vì vậy tôi ném vào của riêng tôi) -

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

cảm ơn mã mẫu. Tôi nghi ngờ câu hỏi của tôi ở đây: http://stackoverflow.com/questions/39273459/ios-mkmapview-custom-images-display-on-top-left-corner liên quan đến KVO. nhưng làm thế nào mapView có thể quan sát sự thay đổi tọa độ và vẽ lại giao diện người dùng? – cooltch

Các vấn đề liên quan