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() }
3 Réponses :
Cela dépend de l ' ordre et du moment dans lesquels vous appelez les méthodes save
et display
.
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é.
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.
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.
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 }
Impossible de le faire fonctionner, il a juste continué à planter de cette façon. Merci pour la démarque aussi :)
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() }
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