无法从SKScene打开一个viewcontroller

时间:2015-02-02 15:43:04

标签: ios swift uiviewcontroller sprite-kit

我创建了一个游戏,主菜单包含在普通的ViewController中,而实际游戏则在SKScene中播放。

我使用主菜单上一个按钮的模态segue来打开SKScene。

我遇到的问题是当我尝试从SKScene返回主菜单时。

我使用此代码显示主菜单

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)

            if homeBtn.containsPoint(location)
            {
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                let settingController: UIViewController = storyboard.instantiateViewControllerWithIdentifier("homeViewController") as UIViewController

                let vc = self.view?.window?.rootViewController
                vc?.presentViewController(settingController, animated: true, completion: nil)

            }
        }
    }

然而,这会导致以下消息:

警告:尝试在视图不在窗口层次结构中的ViewController上显示ViewController!

1 个答案:

答案 0 :(得分:0)

您的场景不应该回调ViewController。它在View和ViewController之间创建了太多的依赖关系。

以下是我在Objective-C中使用delegate的方式(抱歉,我不知道swift)。以下是Swift中的some examples

// GameViewController.h
@interface GameViewController : UIViewController <GameSceneDelegate>


// GameViewController.m
// where we setup new scenes. Don't forget this.
newScene.delegate = self;

-(void)displayMenu {
    ... setup and display the menu
}

创建一个简单的委托类

// GameSceneDelegate.m
@protocol GameSceneDelegate <NSObject>
-(void)displayMenu;
@end

您的游戏场景现在会保留对代表的引用。其他ViewControllers现在可以使用您的GameScene而无需向后引用。

// GameScene.h
@interface GameScene : SKScene
@property (assign) id<GameSceneDelegate> gameSceneController;


// GameScene.m
[self.gameSceneController displayMenu];

你可以将消息传回GameViewController的其他方法是使用NSController,但这有点乱。或者您也可以考虑Reactive Cocoa之类的内容。