在UICollectionView上选择后,从UIVIewController呈现SKScene

时间:2014-07-09 19:27:18

标签: objective-c xcode sprite-kit

我正在尝试为包含多个游戏的项目创建侧滚动菜单。我想让用户水平滚动UICollectionView(在我最初的ViewController中)并点击它来加载其中一个游戏。

我一直在尝试使用:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row == 1) {
    [self showSpinWheel];   
}

- (void)showSpinWheel {
    SKSceneLoader *spinLoaderView = [[SKSceneLoader alloc] init];
   [self presentViewController:spinLoaderView animated:YES completion:nil];
}

选择单元格时,但是当我点击它时它会一直崩溃。

SKSceneLoader拥有此代码,但它并不重要,因为它甚至在加载之前就崩溃了。

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;

    if(!skView.scene) {

        skView.showsFPS = NO;
        skView.showsNodeCount = NO;

        // Create and configure the scene.
        SKScene * scene = [SpinWheel sceneWithSize:skView.bounds.size];
         scene.scaleMode = SKSceneScaleModeAspectFill;

         // Present the scene.
         [skView presentScene:scene];

        // background sound

    }
}

这是错误:

-[UIView scene]: unrecognized selected sent to instance
NSInvalidArgumentException, etc, etc.

如何判断加载场景的正确视图?根据我的理解,我试图将SKCcene加载到UIView中,这是不正确的。我是否需要先加载另一个UIViewController并在那里加载场景?必须有一种从非skcene场景加载SKScene的方法。

1 个答案:

答案 0 :(得分:1)

正如方法名称所示,-presentViewController:animated:completion:只接受UIViewController。最简单的方法是创建一个新的UIViewController子类来处理SKScene的创建并呈现它。


根据您的评论/编辑,问题在于此行。

if(!skView.scene) { ...

UIViewController上的view属性默认只是一个UIView。由于UIView没有scene属性,这就是错误的原因。您需要做的是让它成为SKView。由于您没有笔尖,最简单的方法是覆盖SKSceneLoader中的-loadView以将view设置为SKView。

- (void)loadView
{
    self.view = [[SKView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
}