手动操作navigationController的viewControllers数组时iOS手机崩溃

时间:2015-12-03 02:05:18

标签: ios iphone swift uinavigationcontroller

这应该是苹果的一个错误,但我希望有人有解决方案。我没有得到一个典型的应用程序崩溃,我正在重新启动手机(黑屏死机与苹果徽标和一切)。它似乎与导航有关。

在我的appDelegate中,我有条不紊地将loginController推送到didFinishLaunchingWithOptions上的应用程序:

let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

let nav = appdelegate.window!.rootViewController as! UINavigationController
let loginLobby = mainStoryboard.instantiateViewControllerWithIdentifier("loginLobby")

if notLoggedIn {
    nav.pushViewController(loginLobby, animated: false)
}

然后我在故事板中设置了push segue,工作正常:

enter image description here

但是,当我点击signUpViewController后退按钮返回loginLobby时,手机会重新启动。

我在其他几个场景中也经常遇到这个错误,最常见的是在我以某种方式操作navigationStack之后尝试释放一个popConviewController而不是标准的storyboard segue。其他人有这个问题吗?

编辑:在此特定实例中,除了以下内容之外我不会收到任何错误消息:

Message from debugger: Terminated due to signal 15

在该错误的其他表现形式中,我收到了诸如Terminating since there is no system app.和偶尔XPC Connection Interrupted之类的消息,这些消息并不多见。我启用了异常断点,但它们并没有捕获任何东西。

编辑:关于rootView是什么似乎有很多问题。这是我设置为root的UINavigationController的另一个屏幕截图:

navigationController is the rootview

4 个答案:

答案 0 :(得分:1)

问题在于故事板。我创建了一个新项目并列出了视图,一切似乎都运行良好。我在故事板源代码中发现了这些在工作版本和破坏版本之间不常见的几行:

<navigationItem key="navigationItem" id="wjx-jP-5kJ"/>
<keyCommands>
    <keyCommand/>
</keyCommands>

我不知道这些行应该做什么,或者他们如何悄悄进入我的故事板文件,但是他们正在崩溃应用程序以致手机必须重新启动。我从主项目中删除了这些行,一切都恢复了。

答案 1 :(得分:0)

你应该setViewControllers:animated:而不是推动。如果这不起作用,则在加载第一个视图控制器后,您需要操作视图控制器堆栈。

答案 2 :(得分:0)

抱歉,我无法添加评论,因为我没有足够的声誉。

您是否在检查loginLobby是否为nil

或许将其包装在if let

if notLoggedIn {
    if let loginLobby = mainStoryboard.instantiateViewControllerWithIdentifier("loginLobby") {
        nav.pushViewController(loginLobby, animated: false)
    }
}

答案 3 :(得分:0)

您是否有理由不设置根视图控制器?在我的练习中,当我有条件地在app delegate中设置窗口时,这就是我所做的:

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let loginVc = storyboard.instantiateInitialViewController() as UIViewController!

if (/*something meets your criteria*/) {
    self.window?.rootViewController = loginVc
}

self.window?.makeKeyAndVisible()