以编程方式创建 ViewController 时,如何将其视图设置为 SKVIew 类型?

Posted

技术标签:

【中文标题】以编程方式创建 ViewController 时,如何将其视图设置为 SKVIew 类型?【英文标题】:When programatically creating a ViewController, how can I set its view to be of type SKVIew? 【发布时间】:2015-06-27 06:04:55 【问题描述】:

我正在 XCode 上开发 ios 游戏。我有几个 SKScene,每个都与一个 UIViewController 类相关联。所以在每个视图控制器的 viewDidLoad 中,我创建了

SKView *skView = (SKView *)self.view
SKScene * scene = [whateverSKScene sceneWithSize:skView.bounds.size]
[skView present scene]

我想避开故事板。但是,当我将 ViewController 从第一个视图控制器呈现到下一个时,应用程序在“[skView present scene]”行崩溃,因为它认为新视图控制器的视图仍然是 UIView ('-[UIView presentScene:]: unrecognized selector sent实例)。

我该如何解决这个问题?具体来说,在创建第二个视图控制器(以编程方式)时,如何将其视图更改为 SKview 而不是 UIview 类型? (我应该注意我希望场景与视图控制器是 1:1 的,因为几乎所有场景都是弹出窗口,比如在游戏中弹出的暂停菜单或弹出设置等)

【问题讨论】:

如何创建第二个视图控制器。如果您不使用故事板/笔尖,则由您来创建 SKView 并将其分配为视图 - 您不能只检索它 视图控制器被创建并呈现在第一个视图控制器中,例如: UIVIewController *test = [[MyViewController2 alloc] init]; [self presentViewController:测试动画:YES]; 那么在视图控制器的初始化程序中,您负责分配 SKView 并将其分配给控制器的视图属性。 我已经得出结论,但据我所知,我的解决方案不起作用(如下)。我将如何分配 SKview?下面的结果只是在我当前的屏幕上以灰色屏幕显示动画。 UIVIewController *test = [[MyViewController2 alloc] init]; test.view = [[SKView alloc] init]; [self presentViewController:测试动画:YES]; 不行,你需要修改你自定义的UIViewController子类的init方法来初始化你的SKView 【参考方案1】:

尝试在您的自定义 ViewController 上实现 loadView 方法,如下所示:

override func loadView() 
        self.view = SKView(frame: CGRect(x: 0, y: 0, width: 320, height: 480))

这是 Apple 的文档所述:

这是子类应该创建其自定义视图层次结构的地方,如果 他们没有使用笔尖。永远不应该直接调用。

【讨论】:

您应该使用UIScreen.mainScreen.applicationFrame 而不是硬编码的矩形。

以上是关于以编程方式创建 ViewController 时,如何将其视图设置为 SKVIew 类型?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式为 ViewController 创建标签栏

以编程方式创建的 ViewController 在 Storyboard 上看起来不像

以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容

Swift:以编程方式编码时,搜索栏未显示在 viewController 上

每当我推送 ViewController - Swift - 以编程方式时,大量 CPU 过度使用

以编程方式从 collectionView Cell didSelectItemAt 推送到新的 ViewController - swift