我一直收到这个错误“在解开一个Optional值时意外地发现了nil”为什么?

时间:2015-06-11 14:47:47

标签: ios swift ads

我添加了这些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)
}

2 个答案:

答案 0 :(得分:1)

GameViewControllerGameScene期间创建viewDidLoad,但您永远不会将其分配给GameScene进行引用

你说var viewController = GameViewController()中有GameScene,但这与首先创建场景的实例不同。

您可以将其添加到viewDidLoad

scene.viewController = self以确保具有非零startAppAd对象的实例是您正在引用的对象。

答案 1 :(得分:0)

你强行展开startAppAd(使用!运算符)告诉编译器“我知道这个选项肯定有一个值;请用它。“但是,在您的代码startAppAd中,假定为零。因此崩溃。

我建议您进行基本的巡回演讲并阅读Apple的"Swift Programming Language"