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)
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( 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
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: >)
}
}
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()
}
}
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.