线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子码=为0x0)获得的纬度和经度时出现错误

线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子码=为0x0)获得的纬度和经度时出现错误

问题描述:

请帮我解决这个问题线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子码=为0x0)获得的纬度和经度时出现错误

import Foundation 
import UIKit 
import MapKit 

class DetailViewController : UIViewController { 

    @IBOutlet weak var mapView: MKMapView! 

    var selectedLocation : LocationModel? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewDidAppear(animated: Bool) { 
     // Create coordinates from location lat/long 
     var poiCoodinates: CLLocationCoordinate2D = CLLocationCoordinate2D() 

     poiCoodinates.latitude = CDouble(self.selectedLocation!.latitude!)! //Problem is in this line 
     poiCoodinates.longitude = CDouble(self.selectedLocation!.longitude!)! 
     // Zoom to region 
     let viewRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(poiCoodinates, 750, 750) 
     self.mapView.setRegion(viewRegion, animated: true) 
     // Plot pin 
     let pin: MKPointAnnotation = MKPointAnnotation() 
     pin.coordinate = poiCoodinates 
     self.mapView.addAnnotation(pin) 

     //add title to the pin 
     pin.title = selectedLocation!.name 
    } 

} 
+1

'CDouble(self.selectedLocation!.latitude!)!'** **三点力解包成一排。你想知道它为什么崩溃!请阅读关于Optionals和安全解包(“可选绑定”),以'if let'为例,它会改变你的生活...... :) – Moritz

我终于找到了解决方案,这里有云:

进口MapKit

class DetailViewController:UIViewController,MKMapViewDelegate {

//var mapType:UISegmentedControl! 
//var showPointsOfInterest:UISwitch! 


@IBOutlet weak var mapView: MKMapView! 

@IBAction func showDirection(sender: AnyObject) { 
} 

var selectedLocation : LocationModel? 
let locationManager = CLLocationManager() 
var currentPlacemark:CLPlacemark? 
//var segmentedControlAciton:UISegmentedControl! 

@IBAction func myLocation(sender: AnyObject) { 
    // Request for a user's authorization for location services 
    locationManager.requestWhenInUseAuthorization() 
    let status = CLLocationManager.authorizationStatus() 
    if status == CLAuthorizationStatus.AuthorizedWhenInUse { 
     mapView.showsUserLocation = true 


    } 

} 

//

override func viewDidLoad() { 
    super.viewDidLoad() 
    // mapView.showsUserLocation = true 
    title = selectedLocation?.name 

    mapView.delegate = self 
} 

override func viewDidAppear(animated: Bool) { 
    // Create coordinates from location lat/long 
    var poiCoordinates: CLLocationCoordinate2D = CLLocationCoordinate2D() 

    poiCoordinates.latitude = CDouble(self.selectedLocation!.latitude!)! 
    poiCoordinates.longitude = CDouble(self.selectedLocation!.longitude!)! 
    // Zoom to region 
    let viewRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(poiCoordinates, 750, 750) 
    self.mapView.setRegion(viewRegion, animated: true) 
    // Plot pin 
    let pin: MKPointAnnotation = MKPointAnnotation() 
    pin.coordinate = poiCoordinates 
    self.mapView.addAnnotation(pin) 

    //add title to the pin 
    pin.title = selectedLocation!.name 
    pin.subtitle=selectedLocation!.address 
    mapView.showsScale = true 



} 

您还没有初始化var selectedLocation : LocationModel?所以当你问self.selectedLocation!它崩溃。

补充说,需要初始化,并尝试重构你的代码在此 方式:

override func viewDidAppear(animated: Bool) { 
    guard let location = self.selectedLocation, let latitude = location.latitude, let longitude = location.longitude else { 
    return //Here was an error, so you can not continue, report it or do something about it before returning 
    } 

    // Create coordinates from location lat/long 
    var poiCoodinates: CLLocationCoordinate2D = CLLocationCoordinate2D() 

    poiCoodinates.latitude = CDouble(latitude)! 
    poiCoodinates.longitude = CDouble(longitude)! 
    // Zoom to region 
    let viewRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(poiCoodinates, 750, 750) 
    self.mapView.setRegion(viewRegion, animated: true) 
    // Plot pin 
    let pin: MKPointAnnotation = MKPointAnnotation() 
    pin.coordinate = poiCoodinates 
    self.mapView.addAnnotation(pin) 

    //add title to the pin 
    pin.title = location.name 
}