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 () has no segue with identifier 'gameOver'' 你能在你的场景中获取scene.viewcontroller 对象吗?如果是,则对该对象执行Segue。 不,我无法理解

以上是关于UIViewController 不会继续使用另一个 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

MKNetworkEngine 不会触发它的方法

分析屏幕报告已禁用。 UIViewController 转换不会被记录

UIViewController 不会弹出

使用目标 c 后,UiViewController 不会从标签栏项目中快速加载

使用目标 c 后,UiViewController 不会从标签栏项目中快速加载

当设备方向发生变化时,UIViewController 不会更新视图的约束