【问题标题】:UIViewController will not segue to another UIViewController?UIViewController 不会继续使用另一个 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标识符的图片
  • 游戏视图控制器嵌入在导航控制器中?
  • 是的,它嵌入在导航控制器中

标签: ios swift uiviewcontroller 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。
    • 不,我无法理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多