Swift pushViewController 导致应用程序崩溃

Posted

技术标签:

【中文标题】Swift pushViewController 导致应用程序崩溃【英文标题】:Swift pushViewController causing app crash 【发布时间】:2020-04-04 06:53:40 【问题描述】:

我是这里的 swift 开发新手,试图将 ios 13 的演示样式更改为使用推送类型的样式。原始源代码使用故事板来设置视图控制器的演示样式,但有一部分是他们用

覆盖的
    override func prepare(for segue: UIStoryboardSegue, sender: Any?)

我设法使用 pushViewController 进行转换,但应用程序在它之后立即崩溃,我可以知道这里有什么问题吗? 这是完整的功能

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let selectedIndex:Int? = menuTableView.indexPathForSelectedRow?.row


    if (selectedIndex! == 0 || selectedIndex! == 1)
        let submitViewController: SubmitViewController = segue.destination as! SubmitViewController

        if (selectedIndex! == 0)
            submitViewController.currency = Constant.CURRENCY_MYR
        else
            submitViewController.currency = Constant.CURRENCY_SGD
        
    else if (selectedIndex! == MENU_ACCOUNT_STATISTIC_INDEX)

        let target: SearchResultViewController = segue.destination as! SearchResultViewController


        target.toolbarOption = SearchResultViewToolBarOption.TOOLBAR_SMS
        target.resultContent = self.resultContent

        self.navigationController!.pushViewController(target, animated: true)



    

这是我得到的错误日志

    2020-04-04 14:50:24.227072+0800 vboss[38120:1974490] *** Terminating app due to uncaught          exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <vboss.MenuViewController: 0x7fd906087e00>.'

【问题讨论】:

如果 segue 已经在进行中,则不能进行推送或任何其他类型的导航。如果你真的想为不同的单元格选择不同的呈现风格,你将不得不定义不同的 segue。 我如何仅针对这部分内容执行此操作?抱歉,因为我是新手 【参考方案1】:

你可以这样试试:

var selectedIndex : Int = -1

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    self.selectedIndex = indexPath.row
    if (selectedIndex == 0 || selectedIndex == 1)
        self.performSegue(withIdentifier: "submitViewController", sender: nil)
    else if (selectedIndex == MENU_ACCOUNT_STATISTIC_INDEX)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let target = storyboard.instantiateViewController(withIdentifier: "searchResultViewController") as! SearchResultViewController
        target.resultContent = self.resultContent
        navigationController?.pushViewController(target, animated: true)
    



override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

    if let submitViewController: ViewController = segue.destination as! SubmitViewController
        if (selectedIndex == 0)
            submitViewController.currency = Constant.CURRENCY_MYR
        else
            submitViewController.currency = Constant.CURRENCY_SGD
        
    

【讨论】:

在我的代码中确实有 func tableView 但我不知道应该如何将其更改为覆盖 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) if (MENU_ACCOUNT_STATISTIC_INDEX == indexPath.row ) // 用于帐户统计 searchManager.performSearchAccountStatistic() 在我做了一些更改后,我收到了这个错误致命错误:在展开可选值时意外发现 nil:文件 /Users/desmondwkh/Downloads/vboss-final/tab88/SearchResultViewController.swift,第 76 行 2020 -04-04 20:28:12.720037+0800 vboss[39539:2111250] 致命错误:在展开可选值时意外发现 nil:文件 /Users/desmondwkh/Downloads/vboss-final/tab88/SearchResultViewController.swift,第 76 行 您是否在情节提要中识别了 SearchResultViewController。故事板 -> SearchResultViewController.swift -> 身份 -> 故事板 ID 是的,它的 SearchResultViewController。 “SearchResultViewController”和“searchResultViewController”是不同的东西【参考方案2】:

问题解决了,实际上是因为这部分使用了为另一个 ViewController 设置的情节提要中的 segue。所以我所要做的就是为那个特定的 segue 更改故事板设置,它也解决了这部分问题。

【讨论】:

以上是关于Swift pushViewController 导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中测试 pushViewController

如何在uitableviewcell swift上使用pushviewcontroller [重复]

Swift pushViewController 导致应用程序崩溃

Swift pushViewController 适用于 iPad 但不适用于 iPhone

swift 页面跳转

Swift 中的自定义 Segue