Fonction Restoration State ne fonctionne pas

Bonjour,
Je tente d’utiliser les fonctions de restorationState car dans mon code je crée un UIButton et lorsque j’appuie dessus cela crée une UIImageView. J’aimerais que lorsque je fais un retour background, que je kill mon app et reviens dessus, mon UIImageView précédemment créée soit de nouveau là.
ma syntaxe est bonne, mais rien à faire, lorsque je reviens sur mon app, tout est revenu à zéro…
mon code :

 import UIKit
import SpriteKit
class ScrollViewController: UIViewController {
var x1 = 200
var testpost = UIImageView()

override func viewDidLoad() {
    super.viewDidLoad()
    
    let addButton = UIButton(frame: CGRect(x: 10, y: 20, width: 100, height: 40))
    addButton.backgroundColor = .black
    addButton.setTitle("add a note", for: .normal)
    addButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    self.view.addSubview(addButton)
    }

func buttonAction(sender: UIButton!) {
    x1 = x1 + 30
    testpost = UIImageView(frame:CGRect(x: x1,y: 0,width: 240,height: 240))
    testpost.image = UIImage(named:"Screenshots 2017-04-18 at 19.41.04")
    view.addSubview(testpost)
    testpost.restorationIdentifier = "testpostId"
    
}

override func encodeRestorableState(with coder: NSCoder) {
    if let imagge = testpost.image {
        coder.encode(UIImagePNGRepresentation(imagge), forKey: "testpostId")
    }
    super.encodeRestorableState(with: coder)
    
}
override func decodeRestorableState(with coder: NSCoder) {
    if let imagge2 = coder.decodeObject(forKey: "testpostId") as? Data {
        testpost.image = UIImage(data: imagge2)
        super.decodeRestorableState(with: coder)
    }}}

info supplémentaire pour ceux qui ont lu jusqu’ici ^^:
Ce qui est étrange c’est que lorsque je lance à nouveau mon app, L’UIImageView créée est visible pendant 1 seconde, puis tout disparait et revient à l’original. J’ai donc l’impression que l’encodage fonctionne, mais quelque chose ne fonctionne pas avec le décodage. J’ai également ajouté les fonctions nécessaires dans app Delegate. J’ai tenté de paramétré un UIScrollView, et la bizaremment aucun soucis, il mémorise ma position avant le kill de l’app.
Je vous remercie, j’en peux plus de ce problème x)

Bonjour,

Pour que ton uiviewcontroller soit prévenu du changement d’état de ton application tu peu tiliser les notification.

Entrer en background ;
notificationCenter.default.addObserver(self, selector: #selector(self.ta_fonction_a_appeler), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)

Retour au premier plan;
NotificationCenter.dafault…addObserver(self, selector: #selector(self.ta_autre_fonction_a_appeler), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)

Ton imageView est afficher seulement quand tu appui sur le boutton, du coup quand ton app est killer et que tu la « ralume » le viewDidLoad est rééxecuter mais l’imageview ne s’affiche pas vu que tu ne lui demande pas de l’afficher.

Pour l’enregistrement de tes images:
let image_data = UIImagePNGRepresentation(imagge)
let save = Userdefaults.standard
save.set(image_data, forKey: « testpostId »)
Pour la restauration:
let save : userdefaults.standared
let data = save.object(forKey: « testpostId ») as! Data
let image = UIImage(data: data)
N’oublie pas de tester tous sa avec des if let

Ce que je te conseil c’est de crée une fonction dans la quel tu vérifie si la clé « testpostId » existe, si oui tu affiche l’imageview et tu lui affect l’image. En suite rajoute cette fonction dans le viewDidload ainsI QUE dans la fonction appeler par l’observer quand l’app revien au premier plan.

J’espère que j’ai bien compris ce que tu voulais faire.

Merci de la réponse. Je débute le coding alors je suis un peu perdu mais je vais relire ça avec attention. Également, avec mon UIButton je vais créer plusieurs UIImageView, c’est un peu comme des notes donc il peut y en avoir à l’infini, ta méthode fonctionnera t-elle toujours ?

Pour moi la fonction de restorationState gardait en mémoire l’état du viewController et tout ce qui a été créé avant d’entrer en background, je pensais qu’il ferait renaître naturellement mes UIImageView, ce n’est pas le cas ?

Merci d’avance

OUi biensur mais au lieu de stocker l’image seul tu peu stocker un tableau d’image sans aucun problème.

Je ne connais pa du tous la fonction restorationState donc du coup on est 2 dans le brouillard :slight_smile:

Pour les futurs intéressés je poste les 2 solutions possibles que j’ai trouvé :

  • La 1ère est de suivre la méthode de @Samir , lorsque je crée un nouvel objet j’ai une variable qui me l’indique et l’objet est recrée via le viewdidload à chaque lancement de l’application. Vu que j’ai plusieurs objet créés, je les stock dans un tableau qui grandi au fur a mesure que j’ajoute des objets dedans.

  • la deuxième est d’utiliser la fonction de restoration state, la seule chose que j’avais oublié pour que cela fonctionne est d’ajouter le code suivant :

      testpost.frame = CGRect(x: x1,y: 0,width: 240,height: 240)
      view.addSubview(testpost)
    

juste après

super.decodeRestorableState(with: coder)

et cela fonctionne.

1 « J'aime »