2017-10-09 66 views
0

我正在开发OSX应用程序。MKPinAnnotationView即使使用Swift正确添加,也不会在MKMapView中显示

我一个子类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注释:我打印出每个注释的标题在日志和他们三个都被列出。在另一位代表的方法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应用程序中尝试相同的代码时,一切正常。我认为我的委托并没有错,因为方法被正确调用。

我希望你能给我提供任何帮助。

+0

如果我制作一个新项目,并复制上面贴出的代码,一切正常。所以我的项目肯定有问题,但不知道从哪里开始。我试图清理和重建项目,但没有任何改变。 我的ViewController设置在故事板 –

回答

0

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

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

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

后来我用这个代码来调用我的窗口,这是errornous:

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

我改变了,在我在我的故事板创建赛格瑞叫下面的代码工作,办法我引脚确实显示:

performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "ShowLocations"), sender: self) 
相关问题