意外发现 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' 属性;在这种情况下删除 weak
和 IBOutlet
.
我知道还有很多其他类似的问题,但我向您保证,据我所知这不是重复的。正如您在下面的代码中看到的,我没有将任何值标记为可选,但是我不断收到此错误。当我 运行 突出显示
的 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' 属性;在这种情况下删除 weak
和 IBOutlet
.