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
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 :
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éthodefunc 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
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 :
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