2017-07-31 1 views
0

Je dois transmettre des données d'un contrôleur de vue, des données de la requête Alamofire, et les envoyer à UIlabels dans le View Controller suivant. Je ne veux pas passer à ce contrôleur de vue pour le moment. Mais le View Controller de destination doit être capable de lire et d'utiliser les données de la requête Alamofire. Je l'ai essayé avec un segue, mais je n'arrive pas à le faire fonctionner et je doute que ce soit la bonne façon de le faire.Swift 3: Nécessité de transmettre les données au contrôleur de vue suivant sans y accéder

C'est ce que j'ai:

Alamofire.request(URL_SCAN_ID, method: .post, parameters: ScanParameters, encoding: JSONEncoding.default) .responseJSON 
       { 

        response in 

        //printing response 
        print(response.request!) 
        print(response.response!) 
        print(response.data!) 
        print(response.result) 
        print(response.error) 

        //getting the json value from the server 
        let value = response.result.value 
        print(value!) 
        let json = JSON(value!) 

        let productdesc0:JSON = json["productdesc"] 
        let productdescString = productdesc0.string 



        self.performSegue(withIdentifier: "ScanInfo", sender: productdescString) 


        func prepareForSegue(segue: UIStoryboardSegue, sender: Any){ 
        if (segue.identifier == "ScanInfo"){ 
         let destinationVC = segue.destination as! ScanInfoViewController 
         destinationVC.productdescription01 = productdescString! 
         print("oeiii",sender) 
        } 


      } 

Je pense que les données sont même pas envoyer au Segue ... l'impression ne montre rien.

+0

Oui, pas la bonne façon de faire les choses. D'abord, n'appelez pas vos méthodes de réseau à partir d'un contrôleur de vue. Deuxièmement, performSegue devrait initier la transition que vous ne voulez pas. Troisièmement, prepareForSegue devrait être dans le ViewController, et devrait être marqué avec "override". Si vous définissez un point d'arrêt dans cette méthode, je suppose qu'il n'est pas appelé. – pbergson

Répondre

0

Dans votre code, la fonction de préparation est à l'intérieur de la fermeture. Cela doit être au niveau du fichier. Si le code donné provient d'un contrôleur de vue, il doit être comme -

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "ScanInfo"){ 
     let destinationVC = segue.destination as! ScanInfoViewController 
     destinationVC.productdescription01 = productdescString! 
     print("oeiii",sender) 
    } 
} 
+0

Merci! J'ai essayé cela aussi, le problème est alors que je ne peux pas utiliser productdescString, car il est utilisé dans une fonction –

+0

Ensuite, vous devez l'enregistrer. Utilisez une propriété de classe. Ayant préparer la fonction à l'intérieur d'une autre portée ne va pas fonctionner. Il doit être disponible au niveau de la classe et doit être remplacé. – Avi

+0

Je l'ai ajusté, j'ai fait un petit ajustement: –