Bloc note V3 - gesturerecognizer

Bonjour à tous,

J’essai d’élaborer une version du bloc note qui me permettrait de supprimer une note.
J’ai opté pour une tableView, et dans la cellule que je personnalise une textView.
J’ai un premier probleme, j’aimerai que la cellule s’adapte - si c’est possible - à la taille de la textView.
Mais mon principal soucis, est de pouvoir supprimer une note en appuyant dessus. J’ai essayer d’implémeter une - ou un- gestureRecognizer, et je bloque au niveau de la fonction qui est chargé de supprimer la note. Je pense qu’il faut que je recupere le numero de la cellule, et c’est que je ne sais pas comment faire.
ci-joint mon ViewController
import UIKit

class ViewController: UIViewController, UITableViewDataSource {
    
    
    @IBOutlet weak var ui_tableView: UITableView!
    @IBOutlet weak var ui_newNote: UITextField!
    var listNote : [Note] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if case let theCell == ui_tableView.cellForRow(at: <#T##IndexPath#>){
            theCell.addGestureRecognizer(UILongPressGestureRecognizer(target : self, action : #selector(deleteNote)))
        }
        //note_cell.addGestureRecognizer(UILongPressGestureRecognizer(target : self, action : #selector(deleteNote)))
    }

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listNote.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell : NoteTableViewCell = tableView.dequeueReusableCell(withIdentifier: "note_cell") as! NoteTableViewCell
        let theNote = listNote[indexPath.row]
        
        cell.dispaly(note: theNote)
        
        return cell
    }
    @IBAction func addNewNote() {
        if ui_newNote.text != "" {
            listNote.append(Note(iidentifier: 1, snote: ui_newNote.text!))
        ui_tableView.reloadData()
        }
    }
    
    func deleteNote(sender: UILongPressGestureRecognizer) {
        // recupere le numéro de la cellule
        print("la cellule est selectionée")
        
    }
}

Merci à vous

Salut William,

tien voilà la solution::

class ViewController: UIViewController, UITableViewDataSource {

@IBOutlet weak var ui_tableView: UITableView!
@IBOutlet weak var ui_newNote: UITextField!
var listNote : [Note] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

  // On cree l'object qui va detecter un apui long
    let longPress = UILongPressGestureRecognizer()
  // on lui associer une target
    longPress.addTarget(self, action: #selector(self.deleteNote(sender:)))
// on ajoute ce geste a la table 
    ui_tableview.addGestureRecognizer(longPress)
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return listNote.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell : NoteTableViewCell = tableView.dequeueReusableCell(withIdentifier: "note_cell") as! NoteTableViewCell
    let theNote = listNote[indexPath.row]
    
    cell.dispaly(note: theNote)
    
    return cell
}
@IBAction func addNewNote() {
    if ui_newNote.text != "" {
        listNote.append(Note(iidentifier: 1, snote: ui_newNote.text!))
    ui_tableView.reloadData()
    }
}

func deleteNote(sender: UILongPressGestureRecognizer) {
    // recupere le numéro de la cellule grace a sa position quand l'utilisateur reste appuiyer
   // ici on recupere les coordoner du doigt dans la tableview
let position = sender.location(in:ui_tableView)
  // On demande a la table de nous doner l'indexpath de la cellule qui se trouve a cette position
 let indexpath = tableView.indexPathForRow(at: position)
    print("la cellule selectionée est la \(indexPath.row)")
    // une foi que tu a l'index path tu peu san probleme supprimer ta note et reloader la table
}

}

1 « J'aime »

Salut Samir,
Merci pour ta réponse… Donc mis à part quelques petites erreurs, il me manquait la notion de “coordonnées”… sans laquelle je ne peut accéder à la cellule…
Encore merci pour le coup de pouce Samir

Salut Samir,
Bon bin j’ai implémenté mon code avec ce que tu m’as donné… Tout fonctionne.
Encore merci mec

1 « J'aime »

Salut William,

Conten que tous fonctionne pour toi :slight_smile:

Merci…
Par contre un truc me chiffonne… J’ai essayé une autre approche dans la selection de la note à effacer… Sans succès évidement. J’été parti dans l’idée que mon “clic” repère la cellule concernée comme on peut le faire lors d’une transition (cf application contact)… Etait-ce vraiment une mauvaise approche ou est ce moi qui n’est pas réussi à faire ça correctement ?

Donc si je comprend bien c’est pas l’appui long que tu veux mais un clique normal c’est sa ? Si c’est le cas tu n’a pas besoin de le faire avec UIgestureReconizer tu as simplement besoin d’utiliser la méthode « DidSelectRow atIndexPath » du tableviewDelegate.

Ce que tu peux faire aussi d’interessant c’est le swipe ver la gauche pour supprimer :

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete{
// si l’utilisateur glisse ver la gauche ce block et appeler
// il faut donc mettre ton code ici

     }

}

Si c’était l’appuie long que je voulais testé, mais je comprends du coup que le “gestureRecongnizer” exige la gestion des coordonnées lors de l’appuie…
Pour la fonction que tu m’as fourni je vais la tester également :wink:
Merci

1 « J'aime »