意外发现 Nil 展开一个 Optional 值

Unexpectedly found Nil unwrapping an Optional value

我知道还有很多其他类似的问题,但我向您保证,据我所知这不是重复的。正如您在下面的代码中看到的,我没有将任何值标记为可选,但是我不断收到此错误。当我 运行 突出显示

的 snapNext 值时它崩溃了
 viewMap.camera = newLocation

下面是完整的代码,我将 viewMap 链接到一个普通的 UIView

import UIKit
import MapKit
import GoogleMaps

class ViewController: UIViewController {

var camera = GMSCameraPosition.cameraWithLatitude(33.600727, longitude: -117.900840, zoom: 16.9)
@IBOutlet weak var viewMap: GMSMapView!
override func viewDidLoad() {
    super.viewDidLoad()


    viewMap.camera = camera
    viewMap = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
    viewMap.myLocationEnabled = true
    viewMap.settings.myLocationButton = true


    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2DMake(33.600727, -117.900840)
    marker.title = "Newport Beach"
    marker.snippet = "California"
    marker.map = viewMap

    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func snapNext(sender: AnyObject) {
    let newLocation = GMSCameraPosition.cameraWithLatitude(33.622578, longitude: -117.911099, zoom: 16.9)
    viewMap.camera = newLocation

   }
   override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}
import UIKit
import MapKit
import GoogleMaps

class ViewController: UIViewControllerGMSMapViewDelegate , CLLocationManagerDelegate {

var camera:GMSCameraPosition!

@IBOutlet weak var viewMap: GMSMapView!
override func viewDidLoad() {
    super.viewDidLoad()

    camera = GMSCameraPosition.cameraWithLatitude(33.600727, longitude: -117.900840, zoom: 16.9)

    viewMap.camera = camera
    viewMap = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
    viewMap.myLocationEnabled = true
    viewMap.delegate=self

    viewMap.settings.myLocationButton = true


    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2DMake(33.600727, -117.900840)
    marker.title = "Newport Beach"
    marker.snippet = "California"
    marker.map = viewMap

    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func snapNext(sender: AnyObject) {
    camera = GMSCameraPosition.cameraWithLatitude(33.622578, longitude: -117.911099, zoom: 16.9)
    viewMap.camera = camera

   }
   override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

正如您已经指出的,viewMap 为零。为什么要发布它,我不知道(需要更多信息才能知道)。但我知道您可以通过删除 weak 关键字来阻止它。

@IBOutlet weak var viewMap: GMSMapView!

但是,如果您在 viewMap 和视图控制器之间有保留循环,这可能会导致泄漏。

您的错误所在行:

viewMap = GMSMapView.mapWithFrame(CGRectZero, camera: camera)

此处您将映射设置为新的匿名对象,并且由于映射 属性 较弱,一旦匿名对象超出范围(即,当 viewDidLoad 完成时)。 要么你想在故事板中创建对象;要么在这种情况下,将其保留为弱插座,或者您只希望将其作为 'normal' 属性;在这种情况下删除 weakIBOutlet.