이 프로젝트를 이식했습니다 (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 ... 왜 이런 일이 일어나고 있는지 모르겠지만, 코를 바로 잡을 수는 없습니다.
어떻게 깨지나요? 컴파일러 오류가 무엇입니까? – kubi
또한,'skView','scene' 및'scrollView' 글로벌 변수를 만들려고 했습니까? – kubi
또한, 생성시에'skView','scene' 및'scrollView' 값을 설정 한 다음 해당 객체를'viewDidLoad'에 버리는 것으로 보입니다. 초기화되지 않은 변수에 대한 오류를 방지하려면이 작업을 수행하고있는 것 같습니다.이렇게하는 더 좋은 방법은 '!'를 사용하여 뷰를 선언하는 것입니다. 암시 적으로 래핑되지 않은 옵션을 의미합니다. 이러한 객체를 사용하기 전에 nil을 테스트 할 필요는 없지만 객체를 설정하기 전에 사용하려고하면 불어날 수 있습니다. 그들은 다음과 같이 보일 것입니다 :'var skView : SKView!''var scene : GameScene!''var scrollview : UIScrollView! ' – kubi