0

Je travaillais depuis longtemps pour trouver le correctif à mon crash. Je ne sais pas si c'est un défaut de conception fondamental de ma part ou quelque chose qui peut être réparé facilement.Rejet d'un contrôleur ViewController Modal vers un contrôleur de navigation Stack incrusté dans un TabBarController provoquant un plantage

Mon application a un contrôleur de navigation intégré dans un TabBarController. Lorsque je présente une vue modale depuis le contrôleur de vue racine du NavigationController, elle est présentée et rejetée sans problème.

Cependant, après avoir navigué en avant dans la pile de navigation depuis le ViewController racine du NavigationController en poussant d'autres Contrôleurs puis en revenant à la ViewController racine, j'essaie à nouveau la présentation modale. Cette fois, ça se présente bien, mais quand je le rejette, mon application se bloque avec une erreur EXC_BAD_ACCESS. Après un débogage, j'ai constaté que lorsque le ViewController modal présenté est fermé, il tente d'accéder à un ViewController dans la navigation Heiarchy qui a déjà été rejeté et donc le plantage. Malgré le fait qu'il a été présenté à partir du Root ViewController de la pile de navigation.

Cela me cause beaucoup de chagrin et je me demande si quelqu'un est tombé sur quelque chose de similaire. Toute aide est la bienvenue. Merci d'avance.

Voici la présentation qui se produit à l'intérieur d'un bloc AlertController:

let createNewMemoAction = UIAlertAction(title: "Create New Memo", style: .Default) { (action: UIAlertAction!) -> Void in 
    self.performSegueWithIdentifier("Segue To Create New Memo", sender: nil) 
} 

J'utilise un dérouleur de rejeter le viewController. J'ai essayé de rejeter avec le code suivant avec la même erreur:

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

Merci

+0

Veuillez partager le code dans lequel vous présentez et révoquez le contrôleur de vue. –

+0

Je peux voir que le contrôleur de vue de présentation de la vue modale est le contrôleur de tabulation.Je ne suis pas sûr si c'est ce qui cause le problème ou comment le réparer étant donné cela. – alionthego

+0

Juste édité avec présenter et rejeter le code. Présenté depuis le bloc d'une action AlertController. – alionthego

Répondre

0

avez-vous mettre en œuvre la fonction prepareForUnwind dans le contrôleur de vue présentatrice? vous en avez besoin pour que le déroulement fonctionne: voici un exemple dans l'objectif C mais c'est le même concept pour swift! Ce code va dans le contrôleur de vue présentatrice:

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

au lieu d'écrire du code pour rejeter la viewcontroller vous avez juste besoin de ctrl + glisser du bouton que vous utilisez pour rejeter à la sortie en haut de la scène, puis choisissez la fonction « backToHome » dans le menu contextuel

vous devriez vérifier les connexions: https://www.dropbox.com/s/jwpaz1nxvjkautv/Screen%20Shot%202015-07-12%20at%206.16.23%20PM.png?dl=0

+0

Oui, j'ai fait le dérouler correctement et cela fonctionne la première fois que le contrôleur est appelé depuis le contrôleur de la vue racine. Cependant, il essaie en quelque sorte d'accéder à un autre contrôleur de vue la deuxième fois qu'il est rejeté. Je pense qu'il y a un conflit causé par le contrôleur de la barre d'onglets, mais je n'arrive pas à comprendre comment résoudre le problème. – alionthego

0

Je vous recommande de faire pousser Segue et faire votre propre protocole, de cette façon vous pouvez naviguer revenir à tout viewcontroller. Pour exemple, le code viewcontroller poussé je l'ai écrit est:

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!)]; 
    } 
} 

dans le code du contrôleur de vue présentateur est:

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

Merci. Je voulais garder la présentation modale. Il s'avère que le problème était de déclarer une vue sur la ligne en tant que délégué du contrôleur de navigation. Merci à Zombie j'ai réussi à isoler cela. – alionthego

0

Je trouve le problème. J'avais déclaré la deuxième vue dans la hiérarchie de NavigationController en tant que délégué pour le NavigationController. C'est pourquoi c'était référencé. Lorsque j'ai supprimé cette ligne de code, le problème s'est dissipé. Merci beaucoup à tous ceux qui ont commenté et aidé.