2017-06-25 2 views
1

enter image description herePasser des données à travers de multiples contrôleurs de vue avec Segue [Xcode Swift 3.0]

NOTE: Question a été modifié dans le but d'être plus clair avec ma question. Hé, j'essaie de transmettre des données à travers plusieurs VCS. Je veux passer des données (tableaux) à partir de V2 -> V3 puis de V3 -> V1 mais je ne veux pouvoir naviguer que dans les VC en tant que tels: V1 - V2 - V3 et V3 - V2 - V1. Donc, ce que j'ai besoin d'apprendre est de savoir comment passer des données sans naviguer vers un VC différent et de configurer deux méthodes de préparation de données pour passer des données entre V2 -> V3 et V3 -> V1 tout en naviguant entre tous les VCs. Quand je crée mon premier prepareetosegue, je suis incapable d'utiliser d'autres segments associés dans mon VC pour naviguer vers d'autres VCs sans avoir une erreur fatale. Quelqu'un peut-il m'aider? Toute contribution serait grandement appréciée!

Heres ma tentative:

import UIKit 

class ViewController: UIViewController { 
var name = String() 
var StopButInfo = [String]() 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 


} 


    import UIKit 

    class SecondViewController: UIViewController { 

    var StringArray = [String]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 


@IBOutlet var PHeight: UITextField! 
@IBOutlet var PName: UITextField! 



@IBAction func Search(_ sender: Any) { 
    if PHeight.text != ""{ 
     performSegue(withIdentifier: "SearchSegue", sender: self)} 
    let CDstart = String(describing: Date()) 
    StringArray.append(CDstart) 
    StringArray.append(PName.text!) 
    StringArray.append(PHeight.text!) 
    } 




override func prepare(for SearchSegue: UIStoryboardSegue, sender: Any?){ 
    let thirdController = SearchSegue.destination as! ThirdViewController 
    thirdController.SearchButInfo = StringArray 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 


    } 

import UIKit 

class ThirdViewController: UIViewController { 
var height = String() 
var SearchButInfo = [String]() 

var StringArray = [String]() 



@IBAction func Stop(_ sender: Any) { 
    if StringArray.count != 0{ 
     performSegue(withIdentifier: "SegueToStart", sender: self) 
    } 
    let CDStop = String(describing: Date()) 
    StringArray.append(CDStop) 
    StringArray.append(height) 
} 





override func prepare(for SegueToStart: UIStoryboardSegue, sender: Any?){ 
    let firstController = SegueToStart.destination as! ViewController 
    firstController.StopButInfo = StringArray} 





override func viewDidLoad() { 
    super.viewDidLoad() 


    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


    } 
+0

Quelle erreur obtenez-vous et sur quelle ligne de code? Pouvez-vous poster la ligne de code qui casse s'il vous plaît? Et aussi le message d'erreur –

+0

Thread 1: signal SIGABRT en ligne 'let secondController = segueMVH.destination as! ThirdViewController' avec le message d'erreur "Impossible de convertir la valeur de type 'HC.ViewController' (0x107b33ec0) en 'HC.ThirdViewController' (0x107b33f48)." –

Répondre

0

Vous devez vérifier que voir la Segue du contrôleur est sur le point d'être exécuté, cela peut se faire comme cela à l'intérieur méthode prepare(for segueMVH: UIStoryboardSegue, sender: Any?):

if let firstController = segueMVH.destination as! FirstViewController { 
    // Set first view controller's data 

} else if let secondController = segueMVH.destination as! SecondViewController { 
    // Set second view controller's data 

} else if let thirdController = segueMVH.destination as! ThirdViewController { 
    // Set third view controller's data 
} 

Note: Il est préférable utiliser un identifiant différent pour chaque segment afin de pouvoir les distinguer.

0

L'erreur que vous avez eue sur est de dire que vous enregistrez HC.ViewController dans ThirdViewController et c'est pourquoi il a échoué. Cela signifie que le contrôleur de vue de destination de votre segue n'est pas ThirdViewController. Pour vous aider à mieux comprendre le segue: Un segue est une connexion entre un contrôleur de vue source et un contrôleur de vue de destination et ne peut être utilisé qu'entre eux. Voir cette image: enter image description here Dans ce cas, j'ai une connexion segue dans mon storyboard connecté entre le bouton de mon VC1 et VC2. Dans ce cas, mon clic sur le bouton va déclencher cette séquence et la méthode prepare(for segue) ne peut être que dans VC1 où elle transmet les données à VC2. Donc dans votre situation, vous croyez que la destination de votre segue est ThirdViewController mais ce n'est pas le cas. Donc s'il vous plaît vérifier votre segue avec l'identifiant segueMVH pour voir si elle est connectée entre votre contrôleur de vue en cours et votre ThirdViewController.

Espérons que cela aide