Garder une image en mémoire au changement de la vue

Salut à tous, je continue ma petite app et je suis confronté à un nouveau soucis. J'ai bien réussi à sauvegarder mes données utilisateurs entrés dans les texfields, cependant j'ai un soucis pour garder une image en mémoire .
Jai un switch qui permets d'envoyer une requête à une carte Arduino , soit sur on soit sur off . Tous fonctionne parfaitement, mais voila lorsque le switch est sur On, une image ON s'affiche dans le UIImageview, quand le switch est sur Off, c'est une autre image qui doit s'afficher. Tant que je reste sur ce viewcontrolleur, c'est bon, mais par contre si je sors et que je reviens, mon switch sera bien resté sur OFF alors que l'image affiché sur à nouveau l'image On.
Je ne sais pas trop comment sauvegarder l'image en fonction de la position du switch.

Voila ce que j'ai pour l'instant pour modifier l'image en fonction de la position du switch :

@IBAction func SwitchPressed2(_ sender: Any) {

    if switch2.isOn{
        ImageOnClot2.image=UIImage(named: "bouton_on")

                    }
    else {
        ImageOnClot2.image=UIImage(named: "bouton_off")

         }
}

Merci d'avance pour votre petit coup de pouce

Réponses

  • PyrohPyroh Membre

    Il semble qu'il te manque les bases de la programmation iOS. Aucun jugement, ça a été le cas de tout le monde ici.
    Je ne pense pas qu'il soit utile de tenter de te faire un cours ici tant il y a de tutos, livres, blogs, etc.. disponibles sur internet. Dans la langue de ton choix en plus (les plus fouillés sont en anglais).

    Mais pour faire simple ton application doit avoir 3 couches distinctes :

    • la couche modèle qui contient les données brutes non mise en forme.
    • la couche vue qui affiche les données mise en forme.
    • la couche contrôleur qui fait le lien entre le modèle et la vue.

    C'est ce qu'on appelle l'architecture MVC (Model View Controller). Typiquement UIViewController est là pour faire le lien entre les données et la vue qu'il gère.

    Dans ton cas le contrôleur doit s'assurer que quand la vue s'affiche ImageOnClot2 ait la bonne image à afficher. Typiquement ça se passe dans la méthode func viewWillAppear(_ animated: Bool) qui est appelée automatiquement avant que la vue ne s'affiche. Il faut bien entendu que tu sache quoi afficher. C'est ton modèle qui doit te fournir l'info.

    Là ça devient compliqué parce que tu te base sur des appels REST. Vient alors une question plus générale : quite à reprendre tout depuis la base il serait peut-être bon de s'intéresser à Combine et SwiftUI qui sont clairement l'avenir des plateformes Apple. Je ne vais pas te dire que c'est plus simple à apprendre mais c'est plus adapté aux problématiques modernes. Et ton app relève d'une problématique moderne: se baser sur un système distant avec lequel on interagit via des requêtes HTTP.

    Bref si tu veux découvrir tout ça voici quelques resources en anglais (@Draken doit avoir de la resource en français au besoin) :

    SwiftUI

    Combine

    En général

    • Hacking With Swift par Paul Hudson, la bible pour tout ce qui est Swift ou associés. Il propose aussi des formations, je ne les ai pas suivies je ne peux pas donner d'avis. Il a aussi des tonnes de bouquins plutôt bien écrits.
    • Swift by Sundell par John Sundell, plus fouillé que le précédent donc moins accessible aux débutants. C'est pour dans quelques semaines 😉
    • Et ici on peut te filer un coup de main aussi ça nous réveillera et ça fera vivre le forum.
  • DrakenDraken Membre
    mai 2021 modifié #3

    Je ne sais pas trop comment sauvegarder l'image en fonction de la position du switch.

    On ne peut pas, du moins pas comme ça !

    Les viewControleurs sont détruits après utilisation, toutes leurs variables locales aussi. Chaque déplacement de l'utilisateur dans l'arborescence des vues provoque un cycle de destruction/reconstruction, pour économiser la mémoire.

    Le paradigme MVC cité par @Pyroh permet cela en découpant les vues en plusieurs couches logiques : le dessin de l'interface (Vue), le stockage des données (Modele) et la gestion des actions de l'utilisateur (Contrôleur).

    Le dessin de la vue est entièrement statique, c'est à dire que l'état de chaque objet graphique doit être défini par une variable du Modele.

    Le dessin de la vue doit ressembler à ça :

        // Dessin de la Vue
        // ------------
       // Lecture état du switch 
       let etatSwitch = monModele.etatSwitch
        if (etatSwitch) {
          // Aspect visuel
           ImageOnClot2.image=UIImage(named: "bouton_on")
          // Actualisation état switch
           switch2.isOn = true
        } else {
          ImageOnClot2.image=UIImage(named: "bouton_off")
          switch2.isOn = false
        }
    

    Code non testé, tapé à l'arrache, juste pour te donner le principe. Je n'ai pas codé depuis presque un an, et c'était avec SwiftUI. Et pas touché à UIKit depuis des années.

    Pour que l'aspect de l'interface soit préservé en passant d'un viewControleur à un autre, il faut sauvegarder les variables du modèle, grâce à un mécanisme de persistance des données. Il en existe différents types (fichier de configuration de l'application, sauvegarde dans un fichier, utilisation d'une base de données genre CoreData, etc ..).

    A chaque re-création du contrôleur, le code doit recréer le Modele en rechargeant les données persistantes. Puis redessiner la vue avec ce Modele. Pas simple, oui ..


    Lorsque le contrôleur détecte un changement d'état du switch avec une méthode d'action, il ne doit pas agir lui-même sur l'affichage, mais stocker le nouvel état du switch dans le Modele, puis appeler la routine redessinant l'interface.


    Si j'étais courageux j'aurais fait un tuto complet, mais franchement je n'ai pas envie de replonger les mains dans le cambouis d'UIKit.

    Tes clefs de recherche sont : Architecture MVC et Persistance des Données

    Et passe à SwiftUI 💪 !

  • Merci beaucoup

Connectez-vous ou Inscrivez-vous pour répondre.