即使使用Swift正确添加MKPinAnnotationView也不会在MKMapView中显示

时间:2017-10-09 08:09:52

标签: swift macos mkmapview mkannotation mkpinannotationview

我正在开发一个OSX应用程序。

我已经将一个MKAnnotation子类化了:

import Foundation
import MapKit

class LocationAnnotation: NSObject, MKAnnotation {

    var image: NSImage?
    var title: String?
    var coordinate: CLLocationCoordinate2D

    init(image anImage: NSImage?, title aTitle: String, coordinate aCoordinate: CLLocationCoordinate2D) {
        self.image = anImage
        self.title = aTitle
        self.coordinate = aCoordinate
    }
}

在我的NSViewController子类中,我添加了一个MKMapViewDelegate,在Interface Builder中,我添加了一个MKMapView并将其委托设置为NSViewController。

要找出错误的原因,我将 ViewDidLoad 方法中的三个位置添加到数组中。我在 ViewDidAppear 中将这些注释添加到我的地图中。我计划在找出错误的时候将其移到后台主题。

import Cocoa
import MapKit

class ShowLocationsViewController: NSViewController, MKMapViewDelegate {

    @IBOutlet var locationMap: MKMapView!

    private var myLocationArray: [LocationAnnotation] = []
    private var myRegion: MKCoordinateRegion!

    //#MARK: - UIViewController

    override func viewDidLoad() {
        super.viewDidLoad()

        myLocationArray = []
        myRegion = nil

        let locLondon = LocationAnnotation(image: nil, title: "London", coordinate: CLLocationCoordinate2DMake(51.522617, -0.139371))
        let locWembley = LocationAnnotation(image: nil, title: "Wembley", coordinate: CLLocationCoordinate2DMake(51.555909, -0.279600))
        let locGreenwich = LocationAnnotation(image: nil, title: "Greenwich", coordinate: CLLocationCoordinate2DMake(51.476572, -0.001596))

        myLocationArray.append(locLondon)
        myLocationArray.append(locWembley)
        myLocationArray.append(locGreenwich)

        myRegion = MKCoordinateRegion.init(center: locLondon.coordinate, span: MKCoordinateSpanMake(0.20, 0.20)) // 20km span
    }

    override func viewDidAppear() {
        locationMap.addAnnotations(myLocationArray)
        locationMap.setRegion(myRegion, animated: true)
    }
}

使用委托方法 viewFor annotation:时,我会在日志中打印出每个注释的标题,并列出所有这三个注释的标题。在另一个委托方法 didAdd 中,我在日志中打印出地图注释的数量,并打印出三个。但是在我的地图上,没有显示注释。我尝试平移和缩放没有成功。区域可以正确设置和显示。

//#MARK: - MKMapViewDelegate

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
    print(locationMap.annotations.count, views.count)
}

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is LocationAnnotation {
        let annotationIdentifier = "Location"

        var annotationView = locationMap.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) as! MKPinAnnotationView?
        if annotationView == nil {
            annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
        }

        annotationView!.canShowCallout = true

        print(annotationView!.annotation!.title ?? "no view")

        return annotationView
    } else {
        print("no annotation")
        return nil
    }
}

当我在iOS应用程序中尝试相同的代码时,一切正常。我认为我的委托没有任何问题,因为方法被正确调用。

我很感激你能给我的任何帮助。

1 个答案:

答案 0 :(得分:0)

我想出了问题,即调用窗口的方式。

我在AppDelegate中创建了一个变量 mainWindowController ,然后我将我的主NSViewController子类化,以便我可以将AppDelegate连接到它。

let appDelegate = NSApp.delegate as! AppDelegate
appDelegate.mainWindowController = self

之后我用这段代码来调用我的窗口,这是错误的:

let mapViewController = mainWindowController?.storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier.init(rawValue: "ShowLocationsID")) as! ShowLocationsViewController
mainWindowController?.contentViewController?.presentViewControllerAsModalWindow(mapViewController)

我改变了这一点,我在故事板中创建了一个segue,并调用了以下代码,该代码有效且我的引脚确实显示:

performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "ShowLocations"), sender: self)