0

已經工作了很長時間,試圖找到修復我的崩潰。不知道這是我的一個基本設計缺陷還是可以輕鬆解決的問題。解除模態ViewController返回到導航控制器堆棧嵌入TabBarController導致崩潰

我的應用程序在TabBarController中嵌入了NavigationController。當我以模態方式呈現來自NavigationController的根視圖控制器的視圖時,它可以毫無問題地呈現和解散。

但是,當我從navigationController的根ViewController向前導航到導航堆棧並推送其他控制器,然後返回到根ViewController時,我再次嘗試模態表示。這一次它表現良好,但當我解僱它時,我的應用程序崩潰,出現EXC_BAD_ACCESS錯誤。

經過一段時間的調試後,我發現當模式化的ViewController被解僱時,它試圖訪問導航Heiarchy中已經被解散並因此崩潰的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) 
} 

感謝

+0

請分享您提交和解除視圖控制器的代碼。 –

+0

我可以看到模態視圖的呈現視圖控制器是tabbarcontroller。我不知道這是什麼原因導致問題或如何解決這個問題。 – alionthego

+0

剛剛編輯提交和解僱代碼。從AlertController Action的塊內提供。 – alionthego

回答

0

你實現在呈現視圖控制器的prepareForUnwind功能?你需要這樣做才能讓工作順利進行:這是一個C目標的例子,但它對於快速而言是一個概念! 這一代碼進入在呈現視圖控制器:中

@IBAction func backToHome(segue:UIStoryboardSegue) { 
    // code is not necessary here! 
} 

,而不是編寫代碼解僱你只需要按下Ctrl並拖動從您使用在現場的頂部駁回到出口,然後按鈕的ViewController從彈出

選擇功能「backToHome」你應該檢查連接: https://www.dropbox.com/s/jwpaz1nxvjkautv/Screen%20Shot%202015-07-12%20at%206.16.23%20PM.png?dl=0

+0

是的,我已經正確地展開了它,它在第一次從根視圖控制器調用控制器時起作用。然而,它在某種程度上試圖在第二次被解僱時嘗試訪問另一個視圖控制器。我認爲有一些衝突是由標籤欄控制器引起的,但無法弄清楚如何解決這個問題。 – alionthego

0

,我建議你做俯臥撐賽格瑞,使自己的協議,這樣你可以返回到任何視圖 - 控制。對於你的榜樣,我寫的推視圖控制器代碼:

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)  
} 
+0

謝謝。我想保留模態表示。事實證明,問題是作爲導航控制器委託聲明一個視圖。感謝殭屍我設法隔離。 – alionthego

0

我發現這個問題。我已經在NavigationController Hierarchy中聲明瞭第二個視圖作爲NavigationController的委託。這就是它被引用的原因。當我刪除那行代碼時,問題就消失了。非常感謝所有評論和幫助的人。

相關問題