2014-06-12 2 views
0

이 프로젝트를 이식했습니다 (https://gist.github.com/cmezak/8393434). 작동시키고 있지만 클래스의 인스턴스를 처리하고 적절하게 초기화하는 방법에 대한 질문이 있습니다.클래스의 인스턴스 및 올바른 초기화

class GameScene: SKScene { 
    var nodeToScroll: SKSpriteNode 

    init(size: CGSize) { 
     nodeToScroll = SKSpriteNode(imageNamed: "image") 
     super.init(size: size) 
     nodeToScroll.anchorPoint = CGPointMake(0, 0) 
     nodeToScroll.position = CGPointMake(0, size.height - nodeToScroll.size.height) 
     self.addChild(nodeToScroll) 
    } 
} 

을 그리고 GameViewController.swift에서 내가 가진 :

는 GameScene.swift에서 나는 그래서 같은 SKSpriteNode에 인스턴스 속성을 만든

var skView = SKView() 
var scene = GameScene(size: CGSize()) 
var scrollView = UIScrollView() 

class GameViewController: UIViewController, UIScrollViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     skView = SKView(frame: CGRectMake(0, 0, 1024, 768)) 
     self.view.addView(skView) 

     scene = GameScene(size: skView.bounds.size) 
     scene.scaleMode = .AspectFill 

     scrollView = UIScrollView(frame: skView.frame) 
     scrollView.hidden = true 
     scrollView.delegate = self 
     self.view.addSubview(scrollView) 
     scrollView.contentSize = scene.calculateAccumulatedFrame().size 

     skView.addGestureRecognizer(scrollView.panGestureRecognizer) 
     skView.presentScene(scene) 
    } 

내가 말했듯이, 이것은이다 하지만 스위프트 패턴을 따르려는 나의 시도는

if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { 

과 같이 파손됩니다. 그래서 내 질문은 어떻게 내가 viewDidLoad 밖에서 장면의 인스턴스가 필요한 경우를 처리 해야하는 건가요? 나는 이것이 간단한 항구 일 것이다라고 생각했다. 그러나 지금 나는 내가 무엇을하고 있는지에 관해 알지 않고 오랫동안 그것을 꼼짝 않고 바라 보았다. 제안? 편집

: 나는이에의 ViewController 편집 :

var skView: SKView! 
var scene: GameScene! 
var scrollView: UIScrollView! 

class GameViewController: UIViewController, UIScrollViewDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    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 
     self.view.addSubview(skView) 
     /* Set the scale mode to scale to fit the window */ 
     scene.size = skView.bounds.size 

     scene.scaleMode = .AspectFill 

     scrollView = UIScrollView(frame: skView.frame) 
     scrollView.hidden = true 
     scrollView.delegate = self 
     self.view.addSubview(scrollView) 
     scrollView.contentSize = scene.calculateAccumulatedFrame().size 


     skView.addGestureRecognizer(scrollView.panGestureRecognizer) 
     skView.presentScene(scene) 
    } 

} 

내가 경고 나 오류를 얻을하지 않습니다하지만 난 그것을 실행할 때 나는 "심각한 오류 얻을 : 코더 ('초기화 구현되지 않은 초기화를 사용 :) SwiftScrollKit.GameScene ' "

그래서 나는이 GameScene 클래스에

init(coder aDecoder: NSCoder!) { 
    super.init(coder: aDecoder) 
} 

을 추가하고 지금 얻을' '하위 뷰로서 자신을 추가 할 수 없습니다'클래스가 '- hooboy ... 왜 이런 일이 일어나고 있는지 모르겠지만, 코를 바로 잡을 수는 없습니다.

+0

어떻게 깨지나요? 컴파일러 오류가 무엇입니까? – kubi

+0

또한,'skView','scene' 및'scrollView' 글로벌 변수를 만들려고 했습니까? – kubi

+0

또한, 생성시에'skView','scene' 및'scrollView' 값을 설정 한 다음 해당 객체를'viewDidLoad'에 버리는 것으로 보입니다. 초기화되지 않은 변수에 대한 오류를 방지하려면이 작업을 수행하고있는 것 같습니다.이렇게하는 더 좋은 방법은 '!'를 사용하여 뷰를 선언하는 것입니다. 암시 적으로 래핑되지 않은 옵션을 의미합니다. 이러한 객체를 사용하기 전에 nil을 테스트 할 필요는 없지만 객체를 설정하기 전에 사용하려고하면 불어날 수 있습니다. 그들은 다음과 같이 보일 것입니다 :'var skView : SKView!''var scene : GameScene!''var scrollview : UIScrollView! ' – kubi

답변

3

인스턴스 변수의 범위가 수정 될 때까지 멈추지 않을 것입니다. 연결 한 요지는 ViewController 블록의 @implementation { ... } 블록 내부에 선언되어 있지만 여기에는 클래스 외부에 선언되어 전역 범위에 있음을 의미합니다.

viewDidLoad 내부에는 해당 방법의 범위에 sceneskView을 다시 정의하여 구성하는 동안 전역 값을 숨길 수 있습니다. 이 로컬 변수는 viewDidLoad의 끝에서 할당이 해제되므로 설정 한 모든 항목에 액세스 할 수 없게됩니다. (뷰 계층 구조에서 계속 살 수도 있지만 전역 변수는 작동하지 않을 수 있습니다.)

이러한 전역 변수를 클래스 내부로 이동 한 다음 self.variableName을 사용하여 액세스하므로 혼합하지 않아야합니다 지역 변수로 마지막으로

class GameViewController: UIViewController, UIScrollViewDelegate { 
    var skView: SKView! 
    var scene: GameScene! 
    var scrollView: UIScrollView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.scene = // load the scene 
     self.skView = SKView(frame: CGRectMake(0.0, 0.0, 1024.0, 768.0)) 
     self.view.addSubview(self.skView) 
     // etc 
    } 
} 

에서, "자신을 추가 할 수 없습니다 하위 뷰와 같은"오류가 이것 때문에 일어나고있다 :

let skView = self.view as SKView 
// ... 
self.view.addSubview(skView) 
수업 시간에 다른 방법은 또한 viewDidLoad에서 설정 한 내용에 액세스 할 수 있습니다
관련 문제