Swift无法将'UIView'类型的值转换为'SKView'

时间:2018-01-19 19:14:21

标签: ios swift sprite-kit

首先,我回顾了相关问题:

这些都没有为我提供明确的答案,我无法在我的主SKView中展示其中包含ViewController的控制器,例如:

import UIKit
import SceneKit
import SpriteKit

class ViewController: UIViewController {
  var sceneView: SCNView!
  var gameScene = GameScene()
  var spriteScene: OverlayScene!

  override func viewDidLoad() {
    super.viewDidLoad()

    sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
    sceneView.scene = gameScene
  }

  func showModal() {
    let popupViewController = PopupViewController()
    popupViewController.modalPresentationStyle = .popover
    present(popupViewController, animated: true, completion: nil)
  }  
}

但问题似乎是在调用PopupViewController时:

import UIKit
import SpriteKit

class PopupViewController:UIViewController {
  var sceneView:SKView!
  var spriteScene:PopupScene!

  override func viewDidLoad() {
    view.backgroundColor = UIColor.green
    view.scene = spriteScene

    super.viewDidLoad()
  }
}

引发错误:

Could not cast value of type 'UIView' (0x1b48c69c8) to 'SKView' (0x1b3b254b0).

1 个答案:

答案 0 :(得分:2)

查看您的答案,您似乎正在使用view的主PopupViewController来添加场景,而不是您声明的新sceneView。解决这个问题的第一种方法是,如Nathan Hitchings在评论中所述,覆盖loadView并设置self.view = sceneView。另一个选项是打开storyboard或.xib并将主视图的类类型设置为SKView,然后您可以完全删除sceneView变量并使用self.view。两者基本上都做同样的事情,但有两种不同的方式。确保在使用之前给出sceneView一个值,因为它目前似乎保持未初始化状态。如果您需要我澄清任何事情,请告诉我。

第一个选项看起来像这样:

override func loadView() {
    sceneView = SKView()
    sceneView.backgroundColor = .white

    self.view = sceneView
}