在展开可选值时意外发现 MKMapView 为 nil
MKMapView is unexpectedly found nil while unwrapping an Optional value
我编写了这个函数来在地图上绘制叠加层,当我在 MapViewController
的 viewDidLoad
中调用它时它工作正常。
func drawTripLocations(locs: Array<Location>){
var loclist: Array<CLLocationCoordinate2D> = []
if (locs.count > 3){
for loc in locs{
if (loc.gps == 1){
let cord = CLLocationCoordinate2D(latitude: loc.lat!, longitude: loc.lon!)
loclist.append(cord)
}
}
}
if(loclist != nil && loclist.count > 1){
/* if let overlays = self.mainMapView?.overlays {
self.mainMapView.removeOverlays(overlays)
self.mainMapView.delegate = self
}
if let annotations = self.mainMapView?.annotations {
self.mainMapView.removeAnnotations(annotations)
self.mainMapView.delegate = self
}*/
let startmark = loclist.first
let endmark = loclist.last
let polyline = MKPolyline(coordinates: loclist, count: loclist.count)
print(polyline.pointCount)
let mapAnnotation = MKPointAnnotation();
self.addDefaultMapPin("Start" , coordinates: startmark!)
self.addDefaultMapPin("end" , coordinates: endmark!)
self.mainMapView.add(polyline)
zoomPolyline(polyline)
}
}
我需要使用此函数根据 TableViewController
中的新位置绘制叠加层,因为我已在此视图控制器中编写了一个函数:
func getPathLocations(loclist: Array<Location>, stloc: Location, endloc: Location){
var locations: Array<Location> = []
if loclist != nil && loclist.count > 1{
for loc in loclist{
if((Double(loc.tm!) > Double(stloc.tm!) && loc.ign) && (Double(loc.tm!) <= Double(endloc.tm!)) ){
locations.append(loc)
}
}
}
print(locations.count)
let mainstoryboard: UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
let mapViewController: MapViewController = mainstoryboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
mapViewController.drawTripLocations(locs: locations)
}
我面临的问题是当我从其他 viewController
.
调用此函数时,drawTripLocations()
中的 mainMapView
对象始终为 nil
是的,因为 MapViewController
视图尚未加载并且 mainMapView 是 nil
。当您按下/呈现视图控制器时,将加载视图。
选项 1
通过访问 view
属性 来加载视图 UIViewController
let mainstoryboard = UIStoryboard.init(name: "Main", bundle: nil)
let mapViewController = mainstoryboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
_ = mapViewController.view // this will make sure view is loaded
mapViewController.drawTripLocations(locs: locations)
选项 2(更好的一个)
在你的MapViewController
中添加一个属性
var locations:Array<Location>?
并在呈现/推送之前设置位置(而不是调用 drawTripLocations)MapViewController
。
let mainstoryboard = UIStoryboard.init(name: "Main", bundle: nil)
let mapViewController = mainstoryboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
mapViewController.locations = locations
并且在 MapViewController
的 viewDidLoad
方法中
override func viewDidLoad() {
// other code
if let locations = locations {
drawTripLocations(locs: locations)
}
}
我编写了这个函数来在地图上绘制叠加层,当我在 MapViewController
的 viewDidLoad
中调用它时它工作正常。
func drawTripLocations(locs: Array<Location>){
var loclist: Array<CLLocationCoordinate2D> = []
if (locs.count > 3){
for loc in locs{
if (loc.gps == 1){
let cord = CLLocationCoordinate2D(latitude: loc.lat!, longitude: loc.lon!)
loclist.append(cord)
}
}
}
if(loclist != nil && loclist.count > 1){
/* if let overlays = self.mainMapView?.overlays {
self.mainMapView.removeOverlays(overlays)
self.mainMapView.delegate = self
}
if let annotations = self.mainMapView?.annotations {
self.mainMapView.removeAnnotations(annotations)
self.mainMapView.delegate = self
}*/
let startmark = loclist.first
let endmark = loclist.last
let polyline = MKPolyline(coordinates: loclist, count: loclist.count)
print(polyline.pointCount)
let mapAnnotation = MKPointAnnotation();
self.addDefaultMapPin("Start" , coordinates: startmark!)
self.addDefaultMapPin("end" , coordinates: endmark!)
self.mainMapView.add(polyline)
zoomPolyline(polyline)
}
}
我需要使用此函数根据 TableViewController
中的新位置绘制叠加层,因为我已在此视图控制器中编写了一个函数:
func getPathLocations(loclist: Array<Location>, stloc: Location, endloc: Location){
var locations: Array<Location> = []
if loclist != nil && loclist.count > 1{
for loc in loclist{
if((Double(loc.tm!) > Double(stloc.tm!) && loc.ign) && (Double(loc.tm!) <= Double(endloc.tm!)) ){
locations.append(loc)
}
}
}
print(locations.count)
let mainstoryboard: UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
let mapViewController: MapViewController = mainstoryboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
mapViewController.drawTripLocations(locs: locations)
}
我面临的问题是当我从其他 viewController
.
drawTripLocations()
中的 mainMapView
对象始终为 nil
是的,因为 MapViewController
视图尚未加载并且 mainMapView 是 nil
。当您按下/呈现视图控制器时,将加载视图。
选项 1
通过访问 view
属性 来加载视图 UIViewController
let mainstoryboard = UIStoryboard.init(name: "Main", bundle: nil)
let mapViewController = mainstoryboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
_ = mapViewController.view // this will make sure view is loaded
mapViewController.drawTripLocations(locs: locations)
选项 2(更好的一个)
在你的MapViewController
中添加一个属性
var locations:Array<Location>?
并在呈现/推送之前设置位置(而不是调用 drawTripLocations)MapViewController
。
let mainstoryboard = UIStoryboard.init(name: "Main", bundle: nil)
let mapViewController = mainstoryboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
mapViewController.locations = locations
并且在 MapViewController
viewDidLoad
方法中
override func viewDidLoad() {
// other code
if let locations = locations {
drawTripLocations(locs: locations)
}
}