Solution simple pour sauvegarder un écran

A-t-on une solution simple pour sauvegarder un écran avec les valeurs ?


 


Je veux dire retrouver les valeurs même si on a réinstallé ou killé l'App ?


Réponses

  • Tu veux dire que l'app reviendrait à  l'écran en question ou bien qu'en avoir une image suffirait ?


  • Perso j'utiliserais Keychain.


  • A-t-on une solution simple pour sauvegarder un écran avec les valeurs ?




    Non ..


    Il faut sauver l'état de l'application (le Modèle des données et de l'interface dans un fichier de persistance) quand l'AppDelegate détecte la plongée en background.


     


    Oups, je n'avais pas tilté sur le " réinstallé " l'application. Cela deviens vraiment compliqué. Le chat sur canapé rouge doit avoir raison, même si je n'ai jamais étudié le sujet. Il faut créer un fichier de persistance sur le compte iCloud de l'utilisateur, pour éviter la destruction des données si l'application est effacé du device.



  • Tu veux dire que l'app reviendrait à  l'écran en question ou bien qu'en avoir une image suffirait ?




     


    l'image c'est déjà  ce que j'ai fait...


     




    Non ..


    Il faut sauver l'état de l'application (le Modèle des données et de l'interface dans un fichier de persistance) quand l'AppDelegate détecte la plongée en background.


     


    Oups, je n'avais pas tilté sur le " réinstallé " l'application. Cela deviens vraiment compliqué. Le chat sur canapé rouge doit avoir raison, même si je n'ai jamais étudié le sujet. Il faut créer un fichier de persistance sur le compte iCloud de l'utilisateur, pour éviter la destruction des données si l'application est effacé du device.




     


    Réinstallé eut été un plus, effacé du device, je veux dire quand on développe il y a réinstallation !!


     


    Ma question était de savoir s'il existait une solution un peu toute faite, mais il semble bien que non !!


     


    @colas_ Keychain c'est quoi au juste ?

  • Regarde FXKeychain


    Même si ton app est effacée du device puis réinstallée les données sont encore sauvegardées sur le device.

    Cela permet par exemple de n'offrir qu'une seule fois une période d'essai, etc.


    Je ne suis pas sûr d'avoir compris pourquoi tu as besoin de cette persistance des données si l'app est réinstallée. Si c'est juste car quand tu développes l'application est réinstallée, alors opte pour un mécanisme plus simple comme NSUserDefaults
  • Hello,


     


    À priori tu as le State Preservation and Restoration. Méconnu et peu utilisé mais qui répond à  tes besoins sauf dans le cas où ton application est supprimé.


     


    https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html


  • GercofisGercofis Membre
    janvier 2018 modifié #8

    Tout ça semble bien correspondre a mon besoin, mais je suis quand même un peu, voir beaucoup largué ?


     


    En plus l'exemple n'est pas en Swift ?


     


    Stroryboard ID et/ou Restauration ID servent a quelque chose comme ça ?


     


    Un tuto peut-être ?


  • Tu as ce tutoriel : https://www.raywenderlich.com/117471/state-restoration-tutorial


     


    ça semble être complet après c'est toujours bien de lire la doc pour comprendre le concept ;)


  • Merci, ça a bien l'air de correspondre a ce que je cherche, donc je potasse, je potasse...


  • Je ne sais pas comment modifier ma réponse maintenant, donc ce tuto est en Swift 2.2 ça ne passe donc pas tout seul. Mais j'ai trouvé une piste plus récente, donc je cogite, je teste et je publie si ça beigne...

  • Sans que ça me prenne la tête une question me taraude un peu depuis que j'ai posté ce sujet, peut-être assez mal.
    En fait j'aurais dû comment on sauvegarde l'état d'une application ?
    Certaines applications se réouvre dans l'état ou elles étaient a la fermeture, plus ou moins bien d'ailleurs.
    C'est ce que je cherchais initialement c'est pour ça que j'avais mis Solution Simple

  • Il suffit de sauvegarder tous les paramètres de ton application te permettant de la restaurer dans le même état...
    Pour moi dans iPocket Draw, il s'agit :

    • du nom du fichier ouvert,
    • du coefficient de zoom,
    • des deltas X et Y du scrolling en cours,
    • et toutes les préférences diverses et variées...

    Il est vrai qu'ainsi, la restauration peut être différente de l'état initial, par exemple si un écran annexe de réglage était ouvert et que l'app est tuée après avoir été quittée.

  • Il est vrai qu'ainsi, la restauration peut être différente de l'état initial, par exemple si un écran annexe de réglage était ouvert et que l'app est tuée après avoir été quittée.

    Rien ne t’empêche d’associer une référence à chaque écran de l’application. Et de mémoriser la référence de l’écran courant, de manière à restaurer l'affichage exactement dans le même état qu’à la destruction/plongée en background de l’application.

  • GercofisGercofis Membre
    janvier 2018 modifié #15

    @Draken a dit :
    Rien ne t’empêche d’associer une référence à chaque écran de l’application. Et de mémoriser la référence de l’écran courant, de manière à restaurer l'affichage exactement dans le même état qu’à la destruction/plongée en background de l’application.

    Si tu me trouves un Tuto qui fait ça ?

    @Eric P. C'est bien ce que je suis en train de faire. Mais la solution Draken semble plus simple et pour le cas présent surtout me suffit.

  • @Gercofis a dit :

    @Eric P. C'est bien ce que je suis en train de faire. Mais la solution Draken semble plus simple et pour le cas présent surtout me suffit.

    Euh .. ma solution c’est exactement celle d’Eric, avec un élément en plus pour gérer le cas particulier dont il parle.

  • DrakenDraken Membre
    janvier 2018 modifié #17

    @Gercofis a dit :

    @Draken a dit :
    Rien ne t’empêche d’associer une référence à chaque écran de l’application. Et de mémoriser la référence de l’écran courant, de manière à restaurer l'affichage exactement dans le même état qu’à la destruction/plongée en background de l’application.

    Si tu me trouves un Tuto qui fait ça ?

    Le principe est facile à comprendre. Imaginons par exemple une application avec 3 viewControlers que je vais appeler ecran_A, ecran_B et ecran_C.

    Tu crées une clef ecranActif dans ton système de persistance (CoreData par exemple) pour mémoriser l’écran actif. A chaque activation d’un viewControler celui-ci inscrit sa référence dans la clé. Par exemple le viewControlerA écrit la chaîne « ecran_A » dans la clef ecranActif.

    Si l’application est tuée par iOS ou l’utilisateur, la clef ecranActif contient toujours le nom du dernier écran actif. Au prochain démarrage de l’application, dans le code d’initialisation (AppDelegate) tu commences par lire la valeur de la clef pour savoir quel viewControler affiché en premier.

    Cela nécessite d’ajouter un peu de code dans l’AppDelegate, mais ce n’est pas bien compliqué.

  • Merci mais ma mini application ne comporte qu'un écran et justement je n'ai que le problème de récupérer les valeurs saisies ?

  • Bah alors, je ne comprend pas où est le problème. Tu sauves les valeurs des données de ton application dans la persistance à chaque modification, pour les récupérer au redémarrage de l’application.

  • GercofisGercofis Membre
    janvier 2018 modifié #20

    On se comprend mal... Bien sûr que c'est ce que j'ai prévu je pensais simplement qu'il y avait une solution plus simple et plus globale du genre saveSreen (avec tout ce qu'il y a dedans...
    C'est que je n'ai trop rien lu dans ce sens...
    Pour tout dire j'avais quelques espoirs dans l'utilisation de storyboard ID, au fait ça sert a quoi ce truc et la coche "Use Storyboard ID" ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    C'est plus facile d'utiliser le UIStateRestoring protocol qui fait partie d'un UIViewController.

    Il ne faut que cocher "Use Storyboard ID" pour le "Restoration ID"

    et ajouter du code comme ci-dessous pour ajouter l'état des données :

    final class ArtistsDetailViewController: UIViewController
    {
      enum CodingIdentifier : String, NSCodable
      {
        case eventID
      }
      …
    
      override func encodeRestorableState(with coder: NSCoder)
      {
        super.encodeRestorableState(with: coder)
    
        guard let event = self.event else
        {
          return
        }
    
        let eventID = event.objectID.uriRepresentation()
    
        CodingIdentifier.eventID.encode(eventID, with: coder)
      }
    
      override func decodeRestorableState(with coder: NSCoder)
      {
        super.decodeRestorableState(with: coder)
    
        guard let eventIDURL = CodingIdentifier.eventID.decodeObject(with: coder) as? URL,
              let eventID = DataProvider.sharedInstance.managedObjectContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: eventIDURL),
              let event = DataProvider.sharedInstance.managedObjectContext.object(with: eventID) as? CDEvent else
        {
          return
        }
    
        self.event = event
    
        self.configureView()
      }
    }
    
  • Il n'aime pas NSCoder et NSCodable ???

  • Joanna CarterJoanna Carter Membre, Modérateur

    Qui ne l'aime pas ?

  • Xcode

  • GercofisGercofis Membre
    janvier 2018 modifié #25

    Je crois a la réflexion que cette solution dépasse mes compétences actuelles :'(

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