La feuille SwiftUI montre une feuille avec des données erronées

Aug 15 2020

J'ai une liste qui affiche 1, 2 et 3. Lorsque le texte est tapé, l'application ouvre une feuille avec le numéro tapé. Cependant, si j'appuie sur le texte de la deuxième ou de la troisième ligne, le nombre affiché dans la feuille est toujours 1. Que fais-je mal?

import SwiftUI

struct ContentView: View {
    
    var numbers = [1, 2, 3]
    @State private var shouldPresentSheet = false
    
    var body: some View {
        List(self.numbers, id: \.self) { number in
            Text("number: \(number)").sheet(isPresented: self.$shouldPresentSheet) {
                Text("This is sheet number \(number)")
            }.onTapGesture {
                self.shouldPresentSheet.toggle()
            }
        }
    }
}

Réponses

pawello2222 Aug 15 2020 at 20:37

Vous devez créer une feuille au lieu de plusieurs feuilles.

Si vous souhaitez l'utiliser, .sheet(isPresented:content:)vous pouvez effectuer les opérations suivantes:

struct ContentView: View {
    var numbers = [1, 2, 3]
    @State private var selectedNumber: Int?

    var body: some View {
        List(numbers, id: \.self) { number in
            Text("number: \(number)")
                .onTapGesture {
                    self.selectedNumber = number
                }
        }
        .sheet(isPresented: binding) {
            Text("This is a sheet number \(self.selectedNumber ?? 0)")
        }
    }

    var binding: Binding<Bool> {
        .init(
            get: { self.selectedNumber != nil },
            set: { _ in }
        )
    }
}

Vous pouvez également utiliser .sheet(item:content:):

struct Model: Identifiable {
    let id: Int
}

struct ContentView: View {
    var numbers = [1, 2, 3].map(Model.init)
    @State private var selectedNumber: Model?

    var body: some View {
        List(numbers, id: \.id) { number in
            Text("number: \(number.id)")
                .onTapGesture {
                    self.selectedNumber = number
                }
        }
        .sheet(item: $selectedNumber) { item in
            Text("This is a sheet number \(item.id)")
        }
    }
}

ÉDITER

Si vous décidez d'utiliser, .sheet(item:content:)vous pouvez ajouter une extension à Int(au lieu de créer une structure personnalisée conforme à Identifiable):

extension Int: Identifiable {
    public var id: Int { self }
}

comme proposé dans la réponse d'Asperi .