Ios 解除模态ViewController返回到嵌入在TabBarController中的导航控制器堆栈导致崩溃
我已经工作了很长时间,试图找到解决我的崩溃的方法。不确定这是我的一个基本设计缺陷还是可以轻易修复的 我的应用程序在TabBarController中嵌入了NavigationController。当我从NavigationController的根视图控制器模式地呈现一个视图时,它会被呈现和取消,没有任何问题 但是,在导航堆栈中从NavigationController的根ViewController向前导航并推送其他控制器,然后返回根ViewController之后,我再次尝试modally演示。这一次它表现得很好,但当我关闭它时,我的应用程序崩溃,出现EXC\u BAD\u访问错误 经过一段时间的调试后,我发现当modally presented ViewController被解除时,它正试图访问导航系统中已经解除的ViewController,从而导致崩溃。尽管它是从导航堆栈的根ViewController显示的 这让我很伤心,想知道是否有人遇到过类似的事情。任何帮助都将不胜感激。提前谢谢 以下是在AlertController块中出现的演示:Ios 解除模态ViewController返回到嵌入在TabBarController中的导航控制器堆栈导致崩溃,ios,exc-bad-access,modalviewcontroller,navigationcontroller,tabbarcontroller,Ios,Exc Bad Access,Modalviewcontroller,Navigationcontroller,Tabbarcontroller,我已经工作了很长时间,试图找到解决我的崩溃的方法。不确定这是我的一个基本设计缺陷还是可以轻易修复的 我的应用程序在TabBarController中嵌入了NavigationController。当我从NavigationController的根视图控制器模式地呈现一个视图时,它会被呈现和取消,没有任何问题 但是,在导航堆栈中从NavigationController的根ViewController向前导航并推送其他控制器,然后返回根ViewController之后,我再次尝试modally演示
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的委托。这就是为什么它在解卷时被引用的原因。删除那行就解决了问题!感谢那些评论和帮助的人。是的,我已经正确地完成了展开,并且在第一次从根视图控制器调用控制器时它就工作了。但是,它试图在第二次被解除时访问另一个视图控制器。我认为选项卡栏控制器引起了一些冲突,但无法解决该问题。谢谢。我想保持模态演示。原来问题是将一个视图声明为导航控制器委托。感谢僵尸,我设法把它隔离了。