如何设置以编程方式创建的视图控制器到SKView的视图?
我正在开发一款游戏,并希望有一个sprite-kit场景有自己的视图控制器(经过多次辩论我得出的结论),并且想避免使用故事板(我可以用故事板完成我想要的,但是想学习如何在没有故事板的情况下做到这一点)。
在我的主视图控制器中,单击按钮后,我有以下代码
MyViewController2 *test = [[MyViewController2 alloc] init]; test.view = [[SKView alloc] init]; [self presentViewController: test animated:YES completion:nil];
但是,这只是在灰色屏幕上没有任何内容(没有覆盖“ – (id)init”)。 如果我在MyViewController2中覆盖“ – (id)init”方法,则会调用以下代码:
-(id)init { NSLog(@"init overwrite works"); SKView * skView = (SKView *)self.view; SKScene2 *scene = [SKScene2 sceneWithSize:skView.bounds.size]; scene.scaleMode = SKSceneScaleModeFill; [skView presentScene:scene]; return self; }
但它不会显示,因为我收到此错误:
-[UIView presentScene:]: unrecognized selector sent to instance
我知道这个错误意味着什么(presentScene只能由skView执行而且不能由UIView执行),但即使我创建ViewController并在其init中设置视图只是SKView,我仍然会收到此错误。 我怎样才能解决这个问题? 感谢您的时间和帮助。
view
属性由UIViewController
管理,表示根视图。 您无法在任何时候简单地分配自己的视图。
选项1
如果您希望用自己的视图替换view属性,可以覆盖UIViewController
的loadView
方法并在那里分配视图。 它在此方法的类引用中记录:
视图控制器在请求其view属性但当前为nil时调用此方法。 此方法加载或创建视图并将其分配给view属性
…
您可以覆盖此方法以手动创建视图。 如果选择这样做,请将视图层次结构的根视图分配给视图属性
所以它看起来像这样:
- (void)loadView { self.view = [[SKView alloc] init]; }
选项2
您可以将SKView添加为子视图。
将属性添加到视图控制器,以便在必要时访问它:
@property (strong, nonatomic) SKView *skView;
在加载视图时初始化并将其添加为子视图:
- (void)viewDidLoad { [super viewDidLoad]; self.skView = [[SKView alloc] init]; [self.view addSubview:self.skView]; SKScene2 *scene = [SKScene2 sceneWithSize:self.skView.bounds.size]; scene.scaleMode = SKSceneScaleModeFill; [self.skView presentScene:scene]; }