Ios SpriteKit,Swift 2.0-Scrollview给我一个错误

Ios SpriteKit,Swift 2.0-Scrollview给我一个错误,ios,swift,uiscrollview,swift2,Ios,Swift,Uiscrollview,Swift2,因此,我用init()更新了代码,并使用了可选绑定,正如您所说,它已停止向我提供错误,但现在在我运行模拟时它甚至不会显示,这是什么原因 我还需要它出现在一个不同的场景,叫做菜单,我想知道我是怎么做到的 import UIKit import SpriteKit class GameViewController: UIViewController { var scrollView: UIScrollView! convenience init() { self.init() i

因此,我用init()更新了代码,并使用了可选绑定,正如您所说,它已停止向我提供错误,但现在在我运行模拟时它甚至不会显示,这是什么原因

我还需要它出现在一个不同的场景,叫做菜单,我想知道我是怎么做到的

import UIKit
import SpriteKit

class GameViewController: UIViewController {

var scrollView: UIScrollView!


convenience init() {

    self.init()

if let tempVar = (scrollView) {

    print("hello world")

}

else if scrollView != nil {

    print("hello")

  }

}

 override func viewDidLoad() {
    super.viewDidLoad()

    if let scene = GameScene(fileNamed:"GameScene") {
        // Configure the view.

        let skView = self.view as! SKView

        skView.showsFPS = true
        skView.showsNodeCount = true
        self.view.multipleTouchEnabled = true
        // skView.showsPhysics = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill
        scene.size = skView.bounds.size
        skView.presentScene(scene)

        scrollView = UIScrollView(frame: view.bounds)
        scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 400)

      }

}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    self.scrollView!.frame = self.view.bounds
    self.scrollView!.contentSize.height = 0
    self.scrollView!.contentSize.width = 400

}

override func shouldAutorotate() -> Bool {
    return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
        return .AllButUpsideDown
    } else {
        return .All
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}

override func prefersStatusBarHidden() -> Bool {
    return true
  }

}

我做错了什么?

您已将滚动视图(
滚动器
)定义为(隐式展开的)可选视图。一个可选选项表示,有一个值,它等于x,或者根本没有值。您必须使用可选绑定以安全的方式访问可选的值。在隐式展开可选变量(scrollView!vs scrollView?)的情况下,就像在您的情况下一样,不需要使用可选绑定来有条件地展开可选变量(因为它在访问时将隐式展开),但您必须注意,在尝试使用它时,该变量不是零

在这里,
Scroller
可能为零,因为您似乎还没有实际创建
UIScrollView
的实例(或者至少在代码中看不到)

在访问其属性之前,需要创建
UIScrollView
的实例:

 Scroller = UIScrollView(frame: view.bounds)
可以注意到的另一件事是,您正在使用
unarchiveFromFile
函数创建场景。这是一种“旧”方法,您必须确保已在SKNode上的自定义扩展中定义了此函数(因为在Xcode 7中,在默认的SpriteKit游戏模板项目中再也找不到此扩展)

另外,当使用
viewWillLayoutSubviews
时,请注意它可以被多次调用


提示:类名应大写,而变量应以小写字母开头。

您好,我对编码还不熟悉,您能用更简单的术语解释一下吗?我只是还没有掌握所有的编程术语。@Astrum简言之,在尝试访问Scroller变量(或其属性)之前,您必须确保Scroller变量不是nil。我该如何检查它?(我一周前才开始编程)如果是nill,我将如何修复它?@Astrum使用可选绑定,如果让tempVar=optionalVar{…}或optionalVar!=nil{/…在这里使用强制展开}但除此之外,似乎您不明白在使用对象之前必须初始化它。如果您是初学者,您必须从基本的OOP概念开始,如类、对象、初始化和变量。然后转到Swift特定的东西,如期权。等等,然后你可以跳进去,使用UIKit元素,比如UIScrollView。嗨,你能再次阅读我的问题吗,因为我已经用新代码更新了它,还有一些关于它的问题。