Partage
  • Partager sur Facebook
  • Partager sur Twitter

Swift- afficher image dans second view controller

image extraite de l'API de wikipedia que je n'arrive pas à afficher

    5 janvier 2020 à 14:23:43

    Bonjour,

    Je construit une application IOS qui permet d'obtenir des informations sur un terme ou une personne. ces infos sont extraites de wikipedia.

    En tapant un mot clé dans un text field et en cliquant ensuite sur un bouton, on fait une requête http qui permet de récupérer le resumé de l'article present sur wikipedia (via l'API de wikipedia) et ensuite de l'afficher dans un text view situé dans un second view controller. 

    je récupère aussi une image illustrative (aussi extraite de l'API de wikipedia) et elle est aussi supposée s'afficher dans un image view situé dans le second view controller.

    j'arrive a transférer et afficher le resumé de l'article via "prepare for segue", mais lorsque je fais la même manipulation pour l'image, celle ci n'est pas transférée.

    Je me permets d'afficher mon code pour le premier et le second view controller.

    1. premier view controller

    import UIKit
    import Alamofire
    import SwiftyJSON
    import SDWebImage // me permet d'ajouter une image venant de wikipedia pour illustrer mon paragraphe recherché
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var textEntryLabel: UITextField!
        @IBOutlet weak var segueButton: UIButton!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            //darkMode()
            // on appelle la fonction qui gere les couleurs alternatives lorsque dark mode est detecté
            if traitCollection.userInterfaceStyle == .dark {
                darkMode()
            }
            
        }
        
        //MARK: - Relevant variables
        let wikipediaURl = "https://en.wikipedia.org/w/api.php"
        var termDefinitionInfo: String = ""
        var illustration = UIImageView()
        let segueName: String = "toDefinition"
        
        //MARK: - Button tapped action
    
        @IBAction func buttonToDefinition(_ sender: UIButton) {
            // on appelle la fonction ici
            httpCall(termDefinition: textEntryLabel.text ?? "Nothing to verify")
        }
        
        //MARK: - handles what needs to be done prior to triggering the segue
        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == segueName {
                
                if let secondVC = segue.destination as? DefinitionViewController {
                    //secondVC.imageIllustrative = illustration.image
                    secondVC.definition = termDefinitionInfo
                    secondVC.imageIllustrative = illustration.image
                    
                    
                } else {
                    fatalError("Could not perform request!")
                }
                
            }
        }
        
        //MARK: - NETWORKING
          
          func httpCall(termDefinition: String) {
            let parameters : [String:String] = [
                   "format" : "json",
                   "action" : "query",
                   "prop" : "extracts|pageimages",
                   "exintro" : "",
                   "explaintext" : "",
                   "titles" : termDefinition,
                   "indexpageids" : "",
                   "redirects" : "1",
                   "pithumbsize" : "500"
                   ]
              
              //
              request(wikipediaURl, method: .get, parameters: parameters).responseJSON { (response) in
                  if response.result.isSuccess {
                    //1. on affiche le tableau json initial
                    let definitionJSON: JSON = JSON(response.result.value)
                    print(definitionJSON)
                    
                    // 3 valeurs : pageID,definition et source de l'image
                    let pageId = definitionJSON["query"]["pageids"][0].stringValue
                    let pageDefinition = definitionJSON["query"]["pages"][pageId]["extract"].stringValue
                
                    let imageSource = definitionJSON["query"]["pages"][pageId]["thumbnail"]["source"].stringValue
                    //on attache ces valeurs extraites aux bonnes variables
                    self.illustration.sd_setImage(with: URL(string: imageSource))
                    self.termDefinitionInfo = pageDefinition
                    
                    
                    
                    // cas ou on n'a pas de definition
                    if pageDefinition == "" {
                        self.termDefinitionInfo =  "Désolé,ce que vous cherchez ne se trouve pas sur Wikipedia"
                    }
                    
                    // et on effectue le segue vers le second view controller ici
                    self.performSegue(withIdentifier: "toDefinition", sender: self)
                    print(self.termDefinitionInfo)
                      
                  } else {
                    print("Error! Could not fetch data!")
                }
              }
          }
        
        //MARK: - FONCTION QUI GERE LES COULEURS POUR LE DARK MODE
        func darkMode() {
            //la couleur du texte de la barre de navigation ici blanc
            navigationController?.navigationBar.tintColor = UIColor.white
            // la couleur du text du placeholder ici bleu
            textEntryLabel.attributedPlaceholder = NSAttributedString(string: "Saisir ici le terme à rechercher", attributes: [NSAttributedString.Key.foregroundColor: UIColor.systemBlue])
            // la couleur du text
            textEntryLabel.textColor = UIColor.label
            //la couleur du texte du bouton ici blanc
            segueButton.setTitleColor(UIColor.black, for: .normal)
            
            //la couleur de fonds du bouton
            segueButton.backgroundColor = UIColor.white
            //la couleur de la bordure du bouton
            segueButton.layer.borderColor = UIColor.white.cgColor
            segueButton.layer.borderWidth = 1
        }
        
    }

    2.second view controller

    import UIKit
    import SwiftyJSON
    import Alamofire
    import SDWebImage
    
    class DefinitionViewController: UIViewController {
    
        @IBOutlet weak var definitionIllustrationImageView: UIImageView!
        @IBOutlet weak var definitionTextView: UITextView!
        
        
        // on cree deux variables pour attacher l'image illustrative et la definition
        
        var definition: String?
        var imageIllustrative: UIImage?
        
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            definitionTextView.text = definition
            definitionIllustrationImageView.image = imageIllustrative
    
            // Do any additional setup after loading the view.
        }
    
    
    }
    




    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2020 à 21:15:32

      Salut,

      Dans le viewdidload du second ViewController, imageIllustrative existe ?

      Fais un print de l’image (ou mieux : tu met un breakpoint et tu fais un “po imageIllustrative” dans la console en bas à droite parce que les print C’est pas super clair et il faut recompiler à chaque fois donc C’est chiant)

      • Partager sur Facebook
      • Partager sur Twitter
        12 janvier 2020 à 13:42:14

        j'ai essayé un print statement pour afficher l'image. Le bout de code 

         print("voici l'image: \(definitionIllustrationImageView)") 

        donne le résultat suivant : 

        voici l'image: Optional(<UIImageView: 0x7ffd6157f8f0; frame = (20 160; 374 352); clipsToBounds = YES; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x600001828540>>)

        je ne semble pas voir d'erreur dans le message. 

        jai également tenté de changer le type de la variable imageIllustrative qui devient : 

           var imageIllustrative: UIImageView?

        j'ai donc adapté le viewDidLoad dans "DefinitionViewController" : 

            override func viewDidLoad() {
                super.viewDidLoad()
                
                definitionTextView.text = definition
                definitionIllustrationImageView.image = imageIllustrative?.image
                print("voici l'image: \(definitionIllustrationImageView)")
        
                // Do any additional setup after loading the view.
            }

        Enfin, j'ai donc modifié le prepareForSegue : 

         
            override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                if segue.identifier == segueName {
                    
                    if let secondVC = segue.destination as? DefinitionViewController {
                        //secondVC.imageIllustrative = illustration.image
                        secondVC.definition = termDefinitionInfo
                        secondVC.imageIllustrative = illustration
                        
                        
                    } else {
                        fatalError("Could not perform request!")
                    }
                    
                }
            }

        Meme en changeant un image par un 'imageView', je n'arrive toujours pas a afficher l'image récupérée


        -
        Edité par KyssamaJeanMartin 12 janvier 2020 à 13:50:13

        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2020 à 8:35:07

          Moi je voulais savoir si l’UIImage existait dans le viewDidLoad, pas l’ImageView ;)

          Sinon essaie de passer l’url

          • Partager sur Facebook
          • Partager sur Twitter

          Swift- afficher image dans second view controller

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown