Trier TableView

bonjour à tous,

J’ai créé une petite application pour MacBook avec un TableView qui contient 2 colonnes.
Lorsque je souhaiterai lorsque je clique sur une dès 2 colonnes l’ordre soit en descendant ou ascendant. (comme dans Finder, lorsque l’on veut trier les fichiers par taille par exemple)

Merci par avance.

Les données que tu affiches dans ta TableView sont dans une collection ? Tu peux soit ajouter les données dans ta collection avec la méthode insert(:at:) qui te permet de leur donner l’ordre que tu veux, ou la méthode append(:slight_smile: qui les ajoute strictement à la fin. Tu peux aussi, une fois constituée, la trier dans l’ordre que tu veux avec sort(using[NSSortDescriptor]).
À toi, ensuite, de voir comment tu nourris ta TableView depuis tes données

https://www.hackingwithswift.com/example-code/arrays/how-to-sort-an-array-using-sort

Je peux faire une réponse plus précise, mais pour SwiftUI.

Petit exemple :

La classe DataSource est la source de données (logique). Les informations sont définis dans le tableau listeSource. Il est privé, on ne peut y accéder. C’est une liste de chiffres aléatoires pour la démonstration, mais cela peut être n’importe.

La classe exporte le tableau listeVisible, contenant une copie des données. Le contenu de cette copie peut être triée à la demande, pour les besoins de l’affichage.

class DataSource : ObservableObject {
  private var listeSource = [Int]()
  @Published var listeVisible:[Int]
  
  // Création liste aléatoire
  init() {
    for _ in 0..<12 {
      listeSource.append(Int.random(in: 0...100))
    }
    // Copie de la liste source
    listeVisible = listeSource
  }
  
  func aucunTri() {
    listeVisible = listeSource
  }
  
  // tri liste
  func trierPetitVersGrand() {
    listeVisible = listeSource.sorted(by: <)
  }
  
  func trierGrandVersPetit() {
    listeVisible = listeSource.sorted(by: >)
  }
  
}

Le code complet :

import SwiftUI

class DataSource : ObservableObject {
  private var listeSource = [Int]()
  @Published var listeVisible:[Int]
  
  // Création liste aléatoire
  init() {
    for _ in 0..<12 {
      listeSource.append(Int.random(in: 0...100))
    }
    // Copie de la liste source
    listeVisible = listeSource
  }
  
  func aucunTri() {
    listeVisible = listeSource
  }
  
  // tri liste
  func trierPetitVersGrand() {
    listeVisible = listeSource.sorted(by: <)
  }
  
  func trierGrandVersPetit() {
    listeVisible = listeSource.sorted(by: >)
  }
  
}

struct CelluleView : View {
  var nombre : Int
  var body : some View {
    Text("\(nombre)")
  }
}

struct TableView : View {
  var listeNombre : [Int]
  var body : some View {
    List {
      ForEach(listeNombre, id: \.self) {
        nombre in CelluleView(nombre: nombre)
      }
    }
  }
}


struct ContentView: View {
    @ObservedObject var dataSource = DataSource()
    var body: some View {
      VStack {
        Spacer()
        TableView(listeNombre: dataSource.listeVisible)
        Spacer()
        VStack {
          Button("Plus petit vers plus grand",
                 action: { self.dataSource.trierPetitVersGrand()})
            .font(.title).padding()
          Button("Plus grand vers plus petit",
                 action: { self.dataSource.trierGrandVersPetit()})
            .font(.title).padding()
          }
      }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

@Draken tu sais que c’est pour macOS ?
Je sais que SwiftUI est adaptatif, mais c’est quand même mieux de tester directement sous le système cible.

Je sais aussi que Nico22 veux deux colonnes. Par contre, je ne sais pas s’il programme avec NSKIT ou SwiftUI. Mon exemple est une démonstration d’un principe valable partout.

2 « J'aime »

@Draken OK alors c’est bon !
J’ai eu peur que tu sois parti sur iOS, alors qu’il voulait sur macOS.

Merci @ThonyF et @Draken pour vous réponse.
J’ai pu avancer dans mon dev.