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