如何正确切换到不同的 ViewController

Posted

技术标签:

【中文标题】如何正确切换到不同的 ViewController【英文标题】:How to segue to different ViewController properly 【发布时间】:2015-10-07 04:46:55 【问题描述】:

您好,我已经设置了代码,可以正确地从 GameScene 转移到另一个视图控制器 mainMenuViewController。我设置的代码是

var viewController: GameViewController!
func segue() 
    viewController.dismissViewControllerAnimated(true, completion: nil)
    SettingsViewController.delete(self)

在 GameViewController 中

class GameViewController: UIViewController 

override func viewDidLoad() 
    super.viewDidLoad()
    let skView = view as! SKView
    let scene = GameScene(size: skView.bounds.size)

    skView.showsFPS = true
    skView.showsNodeCount = true
    skView.ignoresSiblingOrder = false
    //skView.showsPhysics = true
    scene.scaleMode = .AspectFill
    skView.presentScene(scene)        
    scene.viewController = self



当一个 SKLabelNode 被点击时被调用。我收到了使用它的建议,因为 mainMenu 是玩家开始游戏时首先加载的场景,并且他们转到 gameScene 所以我被告知要关闭 GameScene 而不是每次都创建新的 segue。我收到错误“致命错误:在展开可选值时意外发现 nil”,并且每当点击按钮时都会崩溃。我假设它正在谈论 viewController。感谢您的帮助!

【问题讨论】:

【参考方案1】:

如果正确理解您的问题,您正在尝试关闭 GameViewController。但是方法 dismissViewControllerAnimated 只会关闭您当前呈现的控制器。因此,由于您的游戏视图控制器没有呈现任何内容,因此无法将其关闭。正如您从代码中所说的,GameViewController 解除了他提出的控制器,它会尝试按照您的意愿进行操作,因此他会获取呈现的视图控制器的属性并尝试解除它,但是该属性为零,因此会出现此类错误。要解决此问题,您应该致电 viewController.presentingViewController.dismissViewControllerAnimated(true, completion: nil) 。 属性presentingViewController 返回显示您的控制器,在您的情况下,控制器显示GameViewController。当你得到这个控制器时,你可以关闭他提供的控制器(在你的情况下,提供的控制器是你的 GameViewController)。所以逻辑是说“父”控制器有权解雇自己(GameViewController)

【讨论】:

现在我得到一个长错误'***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [Noble_Ninja.SettingsViewController delete:]:无法识别的选择器发送到类0x10011c990'***第一掷调用堆栈:(0x186074f5c 0x19ab7bf80 0x18607bb64 0x186078c14 0x185f7cdcc 0x1000f90f4 0x1000f9c4c 0x1000f9d8c 0x18b433a2c 0x18b6016e0 0x18b5faac0 0x18b5cba10 0x18b5c9efc 0x18602c5a4 0x18602c038 0x186029d38 0x185f58dc0 0x1910ac088 0x18b632f44 0x1001115e8 0x19b3a68b8)的libc ++ abi.dylib:与类型的未捕获的异常终止NSException'跨度> 【参考方案2】:

我需要查看您的代码。现在您尝试调用方法 delete 来查看控制器,但据我所知,视图控制器没有这样的接缝。所以认为这是您程序中的其他错误,主要是您将 Noble_Ninja.SettingsViewController 设置为期望具有这种方法的其他对象。那是我的预测我不能说清楚,因为我只有异常描述。尝试在代码中找到调用此方法的位置,而不是在此处放置制动点,并且当程序在制动点处停止时写入控制台(日志)-(po NAME_OF_INSTANCE_THAT_CALLS_SUCH_METHOD)-,它将显示真实的实例类型,因此您可以使用此信息检测真正的问题在哪里。祝你好运

【讨论】:

以上是关于如何正确切换到不同的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

在 SWIFT 中的不同视图之间切换

从侧面菜单 Segue 主 ViewController

Swift 2 - 当 AlertController 出现时如何切换到另一个 ViewController?

如何通过 AlertView 切换到另一个 ViewController 并执行 segue?

Ionic - 如何正确导入 ViewController? - 未捕获(承诺):错误:没有 ViewController 的提供者

如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?