我创建了一个游戏,主菜单包含在普通的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!
答案 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之类的内容。