我不断收到此错误 "unexpectedly found nil while unwrapping an Optional value" 为什么?
I keep getting this error "unexpectedly found nil while unwrapping an Optional value" Why?
我添加了这些 StartApp 插页式广告,但在我的 GameScene 中调用此函数时,我一直收到错误消息。如果我在我的 GameViewController 中调用它,它会完美运行并且我没有收到任何错误,但它在我的 GameScene 中不起作用。我将如何解决这个问题。谢谢!
//这是给出错误的函数。
self.viewController.startAppAd!.loadAdWithDelegate(viewController.self)
//GameViewController.swift
class GameViewController: UIViewController, STADelegateProtocol {
var startAppAd: STAStartAppAd?
override func viewDidLoad() {
super.viewDidLoad()
startAppAd = STAStartAppAd()
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
}
// StartApp Ad loaded successfully
func didLoadAd(ad: STAAbstractAd) {
println("StartApp Ad had been loaded successfully")
startAppAd!.showAd()
}
}
//GameScene.swift
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
var touch: UITouch = touches.first as! UITouch
var location = touch.locationInNode(self)
var node = self.nodeAtPoint(location)
if node.name == "levelone" {
self.viewController.startAppAd!.loadAdWithDelegate(viewController.self)
}
你强制解包 startAppAd
(使用 ! 运算符),它告诉编译器“我知道这个可选值肯定有;请使用它。”但是在您的代码中 startAppAd
可能是零。因此崩溃。
我建议您进行基本浏览并阅读 Apple 的 "Swift Programming Language"
GameViewController
在 viewDidLoad
期间创建了 GameScene
但您永远不会将其分配给 GameScene
以引用
你说你在 GameScene
中有 var viewController = GameViewController()
但那不是最初创建场景的同一个实例。
您可以将此添加到您的 viewDidLoad
scene.viewController = self
以确保具有非 nil startAppAd
对象的实例是您正在引用的实例。
我添加了这些 StartApp 插页式广告,但在我的 GameScene 中调用此函数时,我一直收到错误消息。如果我在我的 GameViewController 中调用它,它会完美运行并且我没有收到任何错误,但它在我的 GameScene 中不起作用。我将如何解决这个问题。谢谢!
//这是给出错误的函数。
self.viewController.startAppAd!.loadAdWithDelegate(viewController.self)
//GameViewController.swift
class GameViewController: UIViewController, STADelegateProtocol {
var startAppAd: STAStartAppAd?
override func viewDidLoad() {
super.viewDidLoad()
startAppAd = STAStartAppAd()
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
}
// StartApp Ad loaded successfully
func didLoadAd(ad: STAAbstractAd) {
println("StartApp Ad had been loaded successfully")
startAppAd!.showAd()
}
}
//GameScene.swift
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
var touch: UITouch = touches.first as! UITouch
var location = touch.locationInNode(self)
var node = self.nodeAtPoint(location)
if node.name == "levelone" {
self.viewController.startAppAd!.loadAdWithDelegate(viewController.self)
}
你强制解包 startAppAd
(使用 ! 运算符),它告诉编译器“我知道这个可选值肯定有;请使用它。”但是在您的代码中 startAppAd
可能是零。因此崩溃。
我建议您进行基本浏览并阅读 Apple 的 "Swift Programming Language"
GameViewController
在 viewDidLoad
期间创建了 GameScene
但您永远不会将其分配给 GameScene
以引用
你说你在 GameScene
中有 var viewController = GameViewController()
但那不是最初创建场景的同一个实例。
您可以将此添加到您的 viewDidLoad
scene.viewController = self
以确保具有非 nil startAppAd
对象的实例是您正在引用的实例。