从SKScene到故事板创建旧场景的实例

时间:2017-11-12 09:14:24

标签: ios swift sprite-kit segue skscene

这是我的故事板,显示了UINavigationController

的segue

enter image description here

我淡出我的游戏场景并从我的SKScene这样调用这个segue:

mainVC?.performSegue(withIdentifier: "tySeg", sender: nil)

导航控制器按照预期在游戏场景的顶部移动UIViewController。但是在转换期间,我可以看到在转换完成之前在后台弹出SKScene的两个新实例,并且它们被新视图控制器覆盖。我的场景didMove(to view:)方法中的打印语句确认SKScene对象出现两次。

我无法弄清楚为什么我的SKScene子类在触发segue后会被自动调用两次。我也试过像这样呈现视图控制器,但也遇到了同样的问题:

mainVC?.present(navVC, animated: false, completion: nil)

我有一个狡猾的解决方法,但我宁愿明白是什么导致这种情况发生,所以我可以阻止它。有什么想法吗?

更新

我怀疑原因与this Apple doc的段落有关:

  

使用时显示视图控制器   UIModalPresentationFullScreen样式,UIKit通常会删除视图   转换动画后的基础视图控制器   完。您可以通过指定来阻止删除这些视图   而是UIModalPresentationOverFullScreen样式。你可能会用它   当呈现的视图控制器具有透明区域时的样式   让基础内容显示出来。

     

使用其中一种全屏演示样式时,视图   启动演示文稿的控制器本身必须覆盖   整个屏幕。如果呈现视图控制器没有覆盖   屏幕,UIKit走向视图控制器层次结构,直到它找到   一个。如果找不到中间视图控制器那个   填充屏幕,UIKit使用窗口的根视图控制器。

您可以在我的屏幕截图中看到GameViewController是我的初始视图控制器。这就是我从中调用segue的地方。就像文档所说的那样,当调用segue时,UIKit可能正在删除底层内容(呈现我的游戏场景的SKView)。但我使用全屏演示风格,UIKit要求场景的视图控制器必须覆盖屏幕。由于它被UIKit删除,然后UIKit上升视图​​层次结构并找到它要调用的GameViewController

我做了很多假设,但似乎这可以解释为什么我的游戏场景被重新创建两次(或者一次......我的测试中有不同的结果),而它调用了一个segue并等待过渡完成。

另外,我注意到如果我将Show中使用的segue更改为Present Modally, Over Full Screen,则问题不会发生。这似乎支持了我的猜测。

1 个答案:

答案 0 :(得分:2)

好吧,在我们的谈话之后,它发现它使用相同的GameViewController实例。 所以在你的情况下你只是解决它。它正在发生,因为你的第二个视图控制器不知道覆盖整个屏幕(或它有不透明度),而系统布局再次是GameViewController。正如你所说:

  

使用其中一种全屏演示样式时,视图   启动演示文稿的控制器本身必须覆盖   整个屏幕。如果呈现视图控制器没有覆盖   屏幕,UIKit走向视图控制器层次结构,直到它找到   一个。如果找不到中间视图控制器那个   填充屏幕,UIKit使用窗口的根视图控制器。

对于其他人,我会保留一些旧答案:

当您segue到视图控制器时,您始终会创建一个新实例。 (所以如果你想重用实例,不要使用segues!)

当你present时,你总是以模态显示它。

当你show移动到另一个视图控制器时。