我想要的只是当用户触摸skscene中的skspritenode时,它将转到不同的视图,如performseguewithidentifier
。谢谢你的帮助。我可以发布代码,但它似乎是一个通用的问题所以我认为你不需要任何代码。顺便说一下,我已经想出了如何检测轻敲skspritenode。我一直在看这个很长一段时间,我很难过。请帮忙。
答案 0 :(得分:9)
您无法在SKScene中呈现viewController,因为它实际上只在SKView上呈现。您需要一种方法将消息发送到SKView的viewController,后者将呈现viewController。为此,您可以使用委托或NSNotificationCenter。
<强>团强>
将以下协议定义添加到SKScene的.h文件中:
@protocol sceneDelegate <NSObject>
-(void)showDifferentView;
@end
并在界面中声明一个委托属性:
@property (weak, nonatomic) id <sceneDelegate> delegate;
然后,在您想要显示共享屏幕的位置,请使用以下行:
[self.delegate showDifferentView];
现在,在viewController的.h文件中,实现协议:
@interface ViewController : UIViewController <sceneDelegate>
并且,在.m文件中,在呈现场景之前添加以下行:
scene.delegate = self;
然后在那里添加以下方法:
-(void)showDifferentView
{
[self performSegueWithIdentifier:@"whateverIdentifier"];
}
<强> NSNotificationCenter 强>
保留-showDifferentView方法,如上一个替代方案中所述。
将viewController作为侦听器添加到其中的-viewDidLoad方法中:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showDifferentView) name:@"showDifferenView" object:nil];
然后,在要显示此viewController的场景中,使用以下行:
[[NSNotificationCenter defaultCenter] postNotificationName:@"showDifferentView" object:nil];
答案 1 :(得分:2)
我建议使用以下选项:(这在你的场景中)
-(void)presentViewController{
MyViewController *myController = [[MyViewController alloc]init];
//Or instantiate any controller from the storyboard with an indentifier
[self.view.window.rootViewController presentViewController:myController animated: YES options: nil];
}
稍后在你的视图控制器中,当你想要解雇它时,做一些这样的事情:
-(void)dismissItself:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
}
关于这个选项的好处是你不需要存储你的视图,因为只要你所在的场景,你可以在任何时候初始化它,导入viewcontroller的代码。
让我知道它是否有效
答案 2 :(得分:0)
ZeMoon,很好的答案,但如果多个场景想要显示相同的视图控制器,例如某些设置屏幕怎么办?您不希望定义多个执行相同操作的场景委托协议。
另一个想法是定义一个协议,为您处理不同视图控制器的呈现:
@protocol ScreenFlowController <NSObject>
- (void)presentSettingsScreenFromScene:(SKScene *)scene;
- (void)presentCreditsScreenFromScene:(SKScene *)scene;
@end
场景参数可用于根据您来自哪里做出决定。
您的游戏(或任何其他对象)的视图控制器实现协议。显示不同屏幕的所有场景都会收到对控制器的弱引用:
@property (nonatomic, weak) id<ScreenFlowController> screenFlowController;