Ios 解除模态ViewController返回到嵌入在TabBarController中的导航控制器堆栈导致崩溃

Ios 解除模态ViewController返回到嵌入在TabBarController中的导航控制器堆栈导致崩溃,ios,exc-bad-access,modalviewcontroller,navigationcontroller,tabbarcontroller,Ios,Exc Bad Access,Modalviewcontroller,Navigationcontroller,Tabbarcontroller,我已经工作了很长时间,试图找到解决我的崩溃的方法。不确定这是我的一个基本设计缺陷还是可以轻易修复的 我的应用程序在TabBarController中嵌入了NavigationController。当我从NavigationController的根视图控制器模式地呈现一个视图时,它会被呈现和取消,没有任何问题 但是,在导航堆栈中从NavigationController的根ViewController向前导航并推送其他控制器,然后返回根ViewController之后,我再次尝试modally演示

我已经工作了很长时间,试图找到解决我的崩溃的方法。不确定这是我的一个基本设计缺陷还是可以轻易修复的

我的应用程序在TabBarController中嵌入了NavigationController。当我从NavigationController的根视图控制器模式地呈现一个视图时,它会被呈现和取消,没有任何问题

但是,在导航堆栈中从NavigationController的根ViewController向前导航并推送其他控制器,然后返回根ViewController之后,我再次尝试modally演示。这一次它表现得很好,但当我关闭它时,我的应用程序崩溃,出现EXC\u BAD\u访问错误

经过一段时间的调试后,我发现当modally presented ViewController被解除时,它正试图访问导航系统中已经解除的ViewController,从而导致崩溃。尽管它是从导航堆栈的根ViewController显示的

这让我很伤心,想知道是否有人遇到过类似的事情。任何帮助都将不胜感激。提前谢谢

以下是在AlertController块中出现的演示:

 let createNewMemoAction = UIAlertAction(title: "Create New Memo", style: .Default) { (action: UIAlertAction!) -> Void in
     self.performSegueWithIdentifier("Segue To Create New Memo", sender: nil)
 }
我正在使用“展开”来关闭viewController。我已尝试使用以下代码驳回,但出现了相同的错误:

 @IBAction func cancelButtonPressed(sender: UIBarButtonItem) {
     dismissViewControllerAnimated(true, completion: nil)
 }

谢谢

您是否在演示视图控制器中实现了prepareForUnwind功能?为了让放松发挥作用,你需要这样做:这是目标C中的一个例子,但对于swift来说,这是相同的概念! 此代码位于显示视图控制器中:

@IBAction func backToHome(segue:UIStoryboardSegue) {
    // code is not necessary here!
}
您不需要编写关闭viewcontroller的代码,只需按住ctrl键并将其从用于关闭的按钮拖动到场景顶部的出口,然后从弹出窗口中选择函数“backToHome”

您应该检查连接:

我建议您推送segue并制定自己的协议,这样您就可以导航回任何viewcontroller。例如,我编写的推式viewcontroller代码是:

import UIKit
protocol BoxMessageDelegate  {  
    func userDidType(controller: TextAddition, sendsmessage: String) ->  Void;    
}


class TextAddition: UIViewController {

    var delegate: BoxMessageDelegate?;
    var message: String?;

    @IBOutlet weak var textMsgField: UITextField!

    @IBAction func `return`(sender: UIButton) {
        self.message = self.textMsgField.text;
        [self.delegate!.userDidType(self, sendsmessage: message!)];
    }
}
在显示视图中,控制器代码为:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "MessageView") {
        var controller = segue.destinationViewController as! TextAddition              
        controller.delegate = self
    }
}

/*
conforming to protocol here
*/
func userDidType(controller: TextAddition, sendsmessage: String) {
    mySquare.text = sendsmessage;
    self.navigationController?.popToViewController(self, animated: true)     
}

我发现了问题。我已将NavigationController层次结构中的第二个视图声明为NavigationController的委托。这就是它被引用的原因。当我删除那行代码时,问题就消失了。非常感谢所有的评论和帮助

请共享显示和取消视图控制器的代码。我可以看到模式视图的显示视图控制器是tabbarcontroller。我不确定这是否是导致问题的原因,也不确定如何解决问题。只是编辑了演示和取消代码。从AlertController操作的块中显示。好的。我用僵尸找到了罪犯。我已将NavigationStack中的第二个ViewController声明为NavigationController的委托。这就是为什么它在解卷时被引用的原因。删除那行就解决了问题!感谢那些评论和帮助的人。是的,我已经正确地完成了展开,并且在第一次从根视图控制器调用控制器时它就工作了。但是,它试图在第二次被解除时访问另一个视图控制器。我认为选项卡栏控制器引起了一些冲突,但无法解决该问题。谢谢。我想保持模态演示。原来问题是将一个视图声明为导航控制器委托。感谢僵尸,我设法把它隔离了。