这是我的故事板,显示了UINavigationController
我淡出我的游戏场景并从我的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
,则问题不会发生。这似乎支持了我的猜测。
答案 0 :(得分:2)
好吧,在我们的谈话之后,它发现它使用相同的GameViewController实例。 所以在你的情况下你只是解决它。它正在发生,因为你的第二个视图控制器不知道覆盖整个屏幕(或它有不透明度),而系统布局再次是GameViewController。正如你所说:
使用其中一种全屏演示样式时,视图 启动演示文稿的控制器本身必须覆盖 整个屏幕。如果呈现视图控制器没有覆盖 屏幕,UIKit走向视图控制器层次结构,直到它找到 一个。如果找不到中间视图控制器那个 填充屏幕,UIKit使用窗口的根视图控制器。
对于其他人,我会保留一些旧答案:
当您segue
到视图控制器时,您始终会创建一个新实例。 (所以如果你想重用实例,不要使用segues!)
当你present
时,你总是以模态显示它。
当你show
移动到另一个视图控制器时。