UIViewController 不会继续使用另一个 UIViewController?
Posted
技术标签:
【中文标题】UIViewController 不会继续使用另一个 UIViewController?【英文标题】:UIViewController will not segue to another UIViewController? 【发布时间】:2016-12-03 04:41:36 【问题描述】:我的 GameViewController 包含一个 SCNView。我可以继续使用我的 GameViewController,但是当我的玩家死亡时,我会尝试继续使用我的 GameOverVC,但它不会继续。我知道代码正在被调用,因为我在控制台上打印了一些东西。 segue 在情节提要中设置。
我通过调用来继续
self.performSegue(withIdentifier: "gameOver", sender: self)
我已经在多个应用程序中这样做了,但我不知道为什么这不起作用。这是我第一个使用 SceneKit 的应用程序,所以我不知道这是否会改变任何东西,但感谢您的帮助!
还有
如果我尝试
let vc = self.view.window?.rootViewController
vc?.present(GameOverVC(), animated: true, completion: nil)
然后它确实显示了 UIViewController 但它没有显示我在该视图中添加的任何内容?
【问题讨论】:
用你放在 segue 的故事板更新你的问题。 它的名字?还是你的意思是图片? 显示segue标识符的图片 游戏视图控制器嵌入在导航控制器中? 是的,它嵌入在导航控制器中 【参考方案1】:不知何故我遇到了同样的问题,异步调用拯救了我: 我做了这样的事情:
DispatchQueue.main.asyncAfter(deadline: .now())
self.performSegue(withIdentifier: "gameOver", sender: self)
如果您需要从不是 ViewController 继承类的对象中分离,您需要将 parentViewController 的 ref 传递给您的对象并进行如下调用:
DispatchQueue.main.asyncAfter(deadline: .now())
parentViewController.performSegue(withIdentifier: "gameOver", sender: self)
【讨论】:
这解决了我的问题!我不确定为什么像 @Lion 这样的常规方法这次不起作用,但我希望有人能告诉我为什么在我的情况下必须这样做。 这个问题花了我几天时间。我不知道为什么普通的segue不起作用。如果你明白它为什么会这样,请告诉我......【参考方案2】:segue
适用于 UIVIewControllers
不适用于 SpriteKit scenes
。因此,您需要从parent viewcontroller
执行segue,这样您就可以执行类似的操作,
self.parentViewController.performSegue(withIdentifier: "gameOver", sender: self)
或者如@ZeMoon in this answer 所述,您可以在SKScene
类中创建viewcontroller
的属性,您可以对该属性执行segue,例如,
class GameScene: SKScene
var viewController: UIViewController?
...
然后,在 viewController 类中,就在skView.presentScene(scene)
do 之前,
scene.viewController = self
现在你可以执行 segue 了,
self.viewController.performSegueWithIdentifier("gameOver", sender: self.viewController)
或
忘记 segue
只需实例化您的 GameOverVC
并将其推送到您的导航控制器上,例如,
let nav = self.view.window?.rootViewController as! UINavigationController
nav.pushViewController(gameOverVC, animated: true)
或者
self.navigationController?.pushViewController(gameOverVC, animated: true)
【讨论】:
【参考方案3】:您可以尝试以下操作:-
UIViewController *vc = self.view.window.rootViewController;
[vc performSegueWithIdentifier:@"id" sender:nil];
【讨论】:
当我尝试这个时,我的应用程序崩溃并打印'Receiver (以上是关于UIViewController 不会继续使用另一个 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章
分析屏幕报告已禁用。 UIViewController 转换不会被记录
使用目标 c 后,UiViewController 不会从标签栏项目中快速加载