1
votes

Comment enregistrer les données de deux UITextViews dans UserDefaults

Pour chaque UITextView utilisant UserDefaults , j'ai créé une fonction à enregistrer et une fonction à afficher.

Quel que soit le texte est ajouté doit être affiché au moment de l'ajout, enregistré, puis affiché à nouveau lors de la nouvelle ouverture de l'application.

Si j'installe l'application avec UNIQUEMENT la fonction à enregistrer, quittez l'application et ajoutez la fonction à afficher puis réinstallez sans supprimer l'application installée, tout fonctionne parfaitement.

Si j'installe l'application avec les deux fonctions ajoutées, cela ne fonctionne pas.

Il doit y avoir une solution simple pour cela, Je fais évidemment quelque chose de mal.

Les données d'un textView sont utilisées pour calculer les résultats puis pour les afficher sur l'autre textView . Toutes les données sont ajoutées avec d'autres fonctions, aucune par l'utilisateur.

    numberHistoryView.isEditable = false
    numberHistoryView.isSelectable = false

func saveHistoryTextView()
{
    let defaults = UserDefaults.standard
    let numberHistory = numberHistoryView.text
    defaults.set(numberHistory, forKey: "combos")
}
func displaySavedHistory()
{
    let defaults = UserDefaults.standard
    let savedCombos = defaults.object(forKey: "combos") as? String ?? ""
    numberHistoryView.text = savedCombos
}

func saveFrequencyTextView()
{
    let defaults = UserDefaults.standard
    let numberFrequency = numberFrequencyCount.text
    defaults.set(numberFrequency, forKey: "frequency")
}
func displaySavedFrequency()
{
    let defaults = UserDefaults.standard
    let savedFrequency = defaults.object(forKey: "frequency") as? String ?? ""
    numberFrequencyCount.text = savedFrequency
}


override func viewWillDisappear(_ animated: Bool)
{
    saveHistoryTextView()
    saveFrequencyTextView()
}
override func viewWillAppear(_ animated: Bool)
{
    displaySavedHistory()
    displaySavedFrequency()
}


6 commentaires

Non lié mais il y a string (forKey: dans UserDefaults


@Superlative, veuillez vérifier la solution simple: stackoverflow.com/a/58724094/6197968


Vous avez dit "J'installe l'application avec les deux fonctions ajoutées, cela ne fonctionne pas" Que voulez-vous dire par ne fonctionne pas? Cela ne donnera aucune valeur ou cela donne de vieilles valeurs?


Rien n'est affiché dans les deux textView


Il ne s'affichera pas après une toute nouvelle installation ou la deuxième fois après avoir enregistré les valeurs dans UserDefault?


Pas après une nouvelle installation et pas après une réinstallation, sauf si je supprime la fonction d'affichage et l'ajoute à nouveau


3 Réponses :


0
votes

Cela dépend de l ' ordre et du moment dans lesquels vous appelez les méthodes save et display .

  1. Lorsque vous installez une nouvelle application, aucune donnée ne sera enregistrée dans UserDefaults . Ainsi, lorsque vous appelez les méthodes displaySavedHistory () et displaySavedFrequency () dans viewWillAppear (_ :) , rien ne sera récupéré car rien n'est encore enregistré.

  2. Maintenant, lorsque vous enregistrez les données à l'aide des méthodes saveHistoryTextView () et saveFrequencyTextView () dans viewWillDisappear (_ :) et puis vous tuez et exécutez à nouveau l'application, les données enregistrées seront récupérées et affichées.

De plus, comme vous enregistrez les données dans UserDefaults et UserDefaults sont enregistrés dans le sandbox , les données ne persister lorsque vous supprimez l'application. Vous devez enregistrer les données dans iCloud ou trousseau etc. si vous souhaitez conserver les données même après la suppression de l'application.


1 commentaires

Les données enregistrées ne sont pas récupérées et affichées tant que les méthodes d'affichage sont présentes. Les méthodes d'affichage doivent être supprimées, puis l'application relancée sans elles. Ensuite, ils doivent être ajoutés à nouveau, puis lorsque l'application est relancée, tout fonctionne parfaitement.



-1
votes

Vous pouvez le faire avec l'observateur de propriété comme:

private let DATA_KEY = "Saved Data"

//After initialising the outlet we can set the data
@IBOutlet weak var textView: UITextView! {
    didSet {
        textView.text = self.data
    }
}

private var data: String {
    set {
        //Save data in user defaults
        UserDefaults.standard.set("The value you will assign", forKey: DATA_KEY)
    }
    get {
        //get the data from user defaults.
        return UserDefaults.standard.value(forKey: DATA_KEY) as? String ?? ""
    }
}

//UITextViewDelegate: set the text data on end of UITextView editing
func textViewDidEndEditing(_ textView: UITextView) {
    self.data = textView.text
}


1 commentaires

Impossible de le faire fonctionner, il a juste continué à planter de cette façon. Merci pour la démarque aussi :)



0
votes

Une fois que j'ai mis mon cerveau dans un état thêta avec la bonne fréquence, j'ai réussi à le comprendre.

Merci à @Naresh et à tous les autres contributeurs d'avoir essayé de m'aider, car vous m'avez peut-être un peu aidé.

La solution nécessitait simplement une simple instruction if.

Tout maintenant fonctionne parfaitement.

func saveHistoryTextView()
{
    if numberHistoryView.text?.count != nil
    {
        let defaults = UserDefaults.standard
        defaults.set(numberHistoryView.text!, forKey: "combos")
    }
}
func displaySavedHistory()
{
    let defaults = UserDefaults.standard
    if let savedCombos = defaults.string(forKey: "combos")
    {
        numberHistoryView.text = savedCombos
    }
}

func saveFrequencyTextView()
{
    if numberFrequencyCount.text?.count != nil
    {
        let defaults = UserDefaults.standard
        defaults.set(numberFrequencyCount.text!, forKey: "frequency")
    }
}
func displaySavedFrequency()
{
    let defaults = UserDefaults.standard
    if let savedFrequency = defaults.string(forKey: "frequency")
    {
        numberFrequencyCount.text = savedFrequency
    }
  }
}


override func viewWillDisappear(_ animated: Bool)
{
    saveHistoryTextView()
    saveFrequencyTextView()
}
override func viewWillAppear(_ animated: Bool)
{
    displaySavedHistory()
    displaySavedFrequency()
}


0 commentaires