Swift MKMapView在GameScene中返回nil

时间:2017-09-20 23:49:26

标签: ios swift sprite-kit mapkit mkmapview

我目前正在尝试使用MapKit和SpriteKit,但是我遇到了一个问题。

当我尝试将地图坐标转换为屏幕上的某个点时(在我的GameScene中),我收到错误:Unexpectedly found nil while unwrapping an optional value

以下代码产生错误,并且在点击屏幕时运行(用于测试目的)。 monster.position = (mapView?.convert(spawnLocation, toPointTo: view))!

monster是在我的GameScene顶部声明的SKSpriteNode。 spawnLocation只是一组坐标(我检查了它们,它们应该在屏幕上可见)。 mapView在我的GameScene顶部声明如下:var mapView = GameViewController().map(我相信我的问题在这里)

检查mapView是否包含值会导致没有任何内容打印到控制台:

if (mapView != nil) {
        print("not nil")
        monster.position = (mapView?.convert(spawnLocation, toPointTo: view))!
}

我运行应用程序时会显示我的地图,但执行上述代码时没有任何反应。我认为我的问题是我目前从GameViewController访问地图的方式,但我不知道如何修复它。

澄清一下:我的地图在我的GameViewController中声明,我需要从我的GameScene访问它,以便我可以将坐标转换为视图中的一个点。

注意:我可能只是使用转换功能错误。

GameViewController:

@IBOutlet var parentView: UIView!
@IBOutlet var map: MKMapView!
@IBOutlet var skview: SKView!

let locationManager = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()

    map.delegate = self
    map.showsScale = false
    map.showsPointsOfInterest = false
    map.showsUserLocation = true
    map.showsBuildings = true
    map.isZoomEnabled = false
    map.isScrollEnabled = false
    map.isPitchEnabled = false
    map.isRotateEnabled = false

    locationManager.requestWhenInUseAuthorization()
    if (CLLocationManager.locationServicesEnabled()) {

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()

    }

    let region = MKCoordinateRegionMakeWithDistance((locationManager.location?.coordinate)!, 400, 400)
    map.setRegion(region, animated: false)

    parentView.addSubview(map)
    parentView.addSubview(skview)

    GIDSignIn.sharedInstance().uiDelegate = self

}

1 个答案:

答案 0 :(得分:0)

因此,在继续处理我的问题之后,我再次看了this问题(我已经在答案中尝试了解决方案 - 它没有用)。 我注意到我的问题可能是我尝试访问MKMapView / GameViewController的场景不是第一个场景。 当我在代码中添加以下内容时,它打印了nil:

print("view controller", self.gameViewController)

然后我查看了负责从第一个场景转换到我遇到问题的代码,并添加了一行:

let signedInTransition = SKTransition.fade(withDuration: 1)

let nextScene = GameScene(size: scene!.size)
nextScene.scaleMode = .aspectFill

nextScene.gameViewController = self.gameViewController /* ADDED THIS LINE */

scene?.view?.presentScene(nextScene, transition: signedInTransition)

原来我的问题是我的场景实际上没有GameViewController因此

let gameViewController:GameViewController!

实际上从未包含过值。