Bloc note Version 2

Bonjour,
J’essaie d’améliorer la version du bloc note que j’ai faite suite au cours. Avant d’aller plus loin, je souhaiterai lui apporter une amélioration : Supprimer la derniere note. Voici ma tentative, qui compile correctement mais qui plante à l’execution. Etant incapable de comprendre le message d’erreur, je vous soumets mon code… Toute aide est la bien venue :wink:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    
    // variables
    @IBOutlet var tfldNouvelleNote : UITextField!
    @IBOutlet var txtListeNote : UITextView!
    var listeNote: [String] = []
    //var tabSauvegarde : [String] = []
    
    // Pour la sauegarde des données utilsateur
    var monBlock = Foundation.UserDefaults.standard
    //var monBlock = Foundation.UserDefaults.array(<#T##UserDefaults#>) as! [String]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // affiche la sauvegarde au chargement de la page
        listeNote = monBlock.array(forKey: "key") as! [String]
        
        // Affiche les notes sauvegardées
        for laListe in listeNote {
        txtListeNote.text! += "\n" + laListe
        }
        
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    
// Fonction
    // Ajoute une note et effectue une sauvegarde
    @IBAction func ajouterNote(sender:UIButton) {
        if tfldNouvelleNote.text != nil {
            listeNote += [tfldNouvelleNote.text!]
             //listeNote.append(tfldNouvelleNote.text!)
            txtListeNote.text! = ""
            
            for note in listeNote {
               txtListeNote.text! += "\n" + note
                print (note + "\n")
            }

            monBlock.set(listeNote,forKey: "key")
            tfldNouvelleNote.text = ""
        }
    }
    //
    
    
    // Efface toute les champs et la sauvegarde
    @IBAction func effecerTout (sender: UIButton) {
        tfldNouvelleNote.text = ""
        txtListeNote.text = ""
        monBlock.removeObject(forKey: "key")
    }
    //
    
    // Valide l'entrée via la touche "Entrée" grace au delegate
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if tfldNouvelleNote.text != "" {
            txtListeNote.text! += "\n" + tfldNouvelleNote.text!
            monBlock.set(listeNote,forKey: "key")
            tfldNouvelleNote.text = ""
            // gere le focus
            tfldNouvelleNote.resignFirstResponder()
            return true
        } else {
            return false
        }
    }
    //
    
    // Effacer la derniere note
    @IBAction func effaceUneNote() {
        listeNote.remove(at: listeNote.count - 1)
        txtListeNote.text! = ""
        
        for note in listeNote {
            txtListeNote.text! += "\n" + note
        }
    }
//
}

Merci à tous

Quand l’application plante , que te dit xcode dans la console ?

Alors c’est imbuvable pour moi pour l’instant…
Voici un copié -collé :

objc[3755]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x116832998) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x116654880). One of the two will be used. Which one is undefined.
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)

Alor en fait d’après ce que je comprend , ton app plante car tu essaye de charger un element "ListeNote "depuis les préférence utilisateur mais on ne sait pas si « monBlock.array(forKey: « key ») as! [String] » retourne quelque chose, car on ne sait pas si la clé existe. Donc ce qu’il faut faire dans ces cas là c’est de toujour tester si l’opération retourne un résulat.

Remplace :
listeNote = monBlock.array(forKey: « key ») as! [String]
par:
if let array = monBlock.array(forKey: « key ») as? [String]{
ListeNote = array

// Affiche les notes sauvegardées
for laListe in listeNote {
txtListeNote.text! += « \n » + laListe
}
}else{
print("aucune note sauvegarder ")
}

tien moi au courant

1 « J'aime »

Je viens de tester… comment dire… ça marche :wink: Merci mec
Donc si je comprends bien, mon erreur venait du fait que je ne vérifiais pas le contenu de “la sauvegarde”…
Je suis à la fois rassuré, en me disant que ce n’était “que” ça, mais va falloir que je fasse attention à ce “que” ça, car je n’arrivais pas a savoir d’ou ça venait.
Sinon, de ce que tu as pu voir de mon code, tu en penses quoi ? Sur la manière dont je m’y suis pris pour enregistrer, effacer la sauvegarde…
Là je vais bucher sur le diaporama… et si ça me prend la tête je reviendrai sur le bloc note pour essayer d’effacer n’importe quelle note. J’ai ma petite idée : effacer la note directement dans mon tableau via son index - ré-afficher la liste sur le bloc note et derrière faire la sauvegarde… Ton avis ?
En tout cas merci pour le coup de pouce :wink:

En toute honnêteté je pense que je ne suis pas à même de juger ton boulot car comme toi je suis un débuant. Tous ce qe je peux te dire c’est que j’ai réussi à lire et à comprendre ton code facilement donc de mon point de vue c’est du bon travail.

Je suis d’accord avec toi sur le fait d’effacer la note depuis son index dans le tableau.

Je sais pas si tu as visionner le dernier chapitre que Maxime a publier qui parlai de la manière dont il faut construire sont code. Je vien juste de comprendre ce principe et du coup maintenant quand je regarde le code de mon app j’ai envi de me tirer une balle, j’ai un viewcontroller long comme comme ma jambe , du coup je vais devoir recoder pour le rendre plus “developer friendly”. Dorénavant quand tu réalise une appli pense toujour a bien respecter le model MVC.

Donc du coup pour en revenir a ton appli, voilà ce que tu pourrais faire.

Crée une classe “Note” dans le quel il y’a 3 prpirété:

  • une pour le texte de la note
  • une pour le titre par exemple
  • une pour la date de créetion/modification

une classe Sauvegarde/lecture de donée dans laquel tu pourrais:
pour la sauvegarde:

  • crée un dictionnaire qui contien 3 key , 1 clé pour la note, une pour le titre, une pour la date
  • ranger ce dictionnaire dans un tableau
  • sauvegarder le tableau dans Userdefault
    pour la lecture:
  • recuperer le tableau
  • crée les objet note a partir des dictionnaire que tu a sortie du tableau
    .etcc

Dans le viewcontroller je verai une uitableview qui affiche la liste des notes

1 « J'aime »

Bonjour Samir,
Je n’avais pas pensé à creer un objet note…
En tout cas merci pour tes conseils.
Je vais mettre en stand-by ce projet pou avancer sur le parcours de Purpulegiraffe, faut que j’avance si je vaux moi aussi publier ma premiere app (c’est mon objectif lol).
Aujourd’hui le programme, essayer de faire le diaporama :wink:
Encore merci pour tes conseils Samir

1 « J'aime »

Bonjour à vous,

J’ai de mon coté aussi pensé à essayer d’utiliser des objets mais j’ai toujours beaucoup de mal à passer à la pratique. Je serai curieux de voir le code d’une app bloc note avec des objets :slight_smile:

@BillyZeBlack j’ai de mon coté fini le diaporama et ça c’est très bien passé. J’ai réussi à faire 60% de l’app sans me tromper avant de regarder la correction. Bon code à toi :wink:

Salut Fabrice,

Si tu le souhaite je peux te faire une mini appli de note avec des object. Je me lance cette après midi deçu et je te l’envoi dès que je fini , je vais essayer de commenter au max le code pour que tous soit claire pour toi.

Oh merci c’est super sympa de ta part Samir :relaxed:

Voilà fabrice, j’ai essayer de faire au plus claire possible.

Sache que c’est une des millionss de solution possible , c’est juste pour que tu puisse voir concretement ce que sa pourrai donner.

ps: dsl par avance pour les fautes d’ortographe :stuck_out_tongue:

voilà le lien :

tien moi au courant

Je regarde ça dès que possible. Je sais pas si j’aurai le temps ce soir car c’est soirée Ciné : Gardien de la Galaxy Vol.2 :wink:
je te remercie encore et je te tiens au courant.

Pas de problème, en tous cas bon film.

@fabrice.sirdey bin ecoute de mon coté, j’ai été complement à coté de la plaque… Du coup je regarde la réponse de Maxime… Bravo à toi :wink:
Pour ce qui est de la manipulation des objets, tu verras que ce n’est pas très compliqué, du moins les bases. Je suis persuadé qu’avec l’exemple de Samir, tu devrais y voir plus clair.
Même si je suis loin du niveau de Samir, si je peux aider…