0

Долгое время пытались найти исправление моей аварии. Не уверен, что это фундаментальный недостаток дизайна с моей стороны или что-то, что можно легко устранить.Увольнение модального контроллера ViewController обратно в контроллер навигационного стека, встроенный в TabBarController, вызывающий сбой

Мое приложение имеет навигационный контроллер, встроенный в TabBarController. Когда я модно представляю представление из контроллера корневого представления NavigationController, он представляется и отклоняется без каких-либо проблем.

Однако, после того, как я перейду вперёд в стеке навигации из корневого ViewController контроллера NavigationController, нажав другие контроллеры, а затем вернусь к корневому ViewController, я снова попробую модальную презентацию. На этот раз это прекрасно, но когда я его увольняю, приложение падает с ошибкой EXC_BAD_ACCESS.

После некоторой отладки я обнаружил, что, когда модально представленный ViewController отклонен, он пытается получить доступ к ViewController в навигационной Heiarchy, которая уже была уволена и, следовательно, сбой. Несмотря на то, что он был представлен с помощью Root 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. – alionthego

ответ

0

вы реализовать функцию prepareForUnwind в контроллере представления Предъявление? вам нужно это для того, чтобы вы могли работать: вот пример в объективе C, но это та же самая концепция для быстрой! Этот код идет в контроллере представления Предъявление:

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

вместо написания кода для увольнения ViewController вам просто нужно Ctrl + перетащить с помощью кнопки можно использовать для отклонения к выходу в верхней части сцены, а затем выбрать функцию «backToHome» из всплывающего окна

вы должны проверить соединение: https://www.dropbox.com/s/jwpaz1nxvjkautv/Screen%20Shot%202015-07-12%20at%206.16.23%20PM.png?dl=0

+0

Да, я правильно разобрался, и он работает при первом вызове контроллера из контроллера корневого представления. Однако каким-то образом он пытается получить доступ к другому контроллеру представления во второй раз, когда он уволен. Я думаю, что некоторые конфликты вызваны контроллером панели вкладок, но не могут понять, как исправить эту проблему. – alionthego

0

Я рекомендую вам нажать 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)  
} 
+0

Спасибо. Я хотел сохранить модальную презентацию. Оказывается, проблема заключалась в объявлении представления вниз по линии в качестве делегата контроллера навигации. Спасибо зомби, мне удалось это изолировать. – alionthego

0

Я нашел проблему. Я объявил второе представление в иерархии NavigationController как делегат для NavigationController. Вот почему на это ссылались. Когда я удалил эту строку кода, проблема исчезла. Большое спасибо всем, кто прокомментировал и помог.