我正在开发一个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应用程序中尝试相同的代码时,一切正常。我认为我的委托没有任何问题,因为方法被正确调用。
我很感激你能给我的任何帮助。
答案 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)