我如何使用didMoveToView作为initWithSize?

时间:2015-01-12 08:15:29

标签: objective-c uiview

我将Xcode更新为版本6。 从那时起,我无法使用过去使用Objective C在Xcode 5中编写的代码。

有一些新文件:GameScene.h和GameScene.m以及GameScene.sks而不是MyScene.h和MyScene.m

他们加载:

-(void)didMoveToView:(SKView *)view {

/* Setup your scene here */

}

而不是通常的

-(id) initWithSize: (CGSize)size {

}

我不能使用我曾经在didMoveToView中的initWithSize中编写的代码,它不能正常工作。如果我自己创建一个initWithSize,它也不起作用。

请帮忙! :)

3 个答案:

答案 0 :(得分:1)

  • didMoveToView:根据关于SKScene的{​​{3}},在视图显示一个场景后,将立即调用此方法,并且该方法将在一个场景中被覆盖。子类。
  

<强>讨论

     

此方法旨在在子类中重写。您可以使用此方法在场景即将由视图呈现时实现场景的任何自定义行为。例如,您可以使用此方法创建场景的内容。

     

7.0及更高版本。

  • initWithSize:在初始化新场景对象时调用此方法,并且只调用一次。

Apple Documentation还有很多,但我找到了另一个可能与您的问题相关的问题。

Apple Documentation around initWithSize - 讨论配置SKScene内容的正确位置,所选答案会比较使用initWithSize:didMoveToView:的差异和优点。

答案 1 :(得分:0)

因为-(void)didMoveToView:(SKView *)view ;是一个新的可选协议,无论你是否使用它都必须实现,因此你不必为Gamescene.m子类进行单独的初始化

答案 2 :(得分:0)

如果从SKS文件加载场景,则无法使用initWithSize,因为它永远不会被调用。在这种情况下,使用initWithCoder初始化场景。

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{

    if (self = [super initWithCoder:aDecoder]) {
        // do stuff
    }

    return self;
}

关于initWith ... vs didMoveToView这个问题。这取决于你想要什么。 Init用于初始化,但你应该知道self.view在场景初始化时为零(读取@Popeye提供的SO链接)。