2017-09-20 39 views
1

我目前正在试验MapKit和SpriteKit,但是我遇到了一个问题。Swift MKMapView在GameScene中返回零

当我尝试转换地图坐标到我的屏幕上的一个点(在我的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 

} 

回答

0

所以继续我的问题的工作后,我又看this问题(我已经试过了答案的解决方案 - 它不工作)。 我发现我的问题可能是在我试图从访问MKMapView/GameViewController现场不是第一现场。 当我增加了以下我的代码,它印零:

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! 

从未实际上包含3 ned一个值。

+0

这样做是否有效添加当前上下文或当前控制器对象,并在其他控制器中处理它我做了同样的事但之前没有为我工作 –

+0

@iOSGeek我不完全确定你在问什么......我上面描述的是为我工作。如果它不为你工作,提供了究竟你的问题是什么的一些更详细 –