【问题标题】:can't open a viewcontroller from an SKScene无法从 SKScene 打开视图控制器
【发布时间】:2015-02-02 15:43:04
【问题描述】:

我创建了一个游戏,其中主菜单包含在普通 ViewController 中,而实际游戏在 SKScene 中进行。

我使用主菜单上按钮的模态转场来打开 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!

【问题讨论】:

  • 你能贴出让你回到“vc”(主菜单)的代码吗?
  • 添加了更多代码,希望它更具解释性

标签: ios swift uiviewcontroller sprite-kit


【解决方案1】:

您的场景不应回调到 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

您的游戏场景现在保留对委托的引用。其他 ViewController 现在可以使用您的 GameScene 而无需向后引用。

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多