La feuille SwiftUI montre une feuille avec des données erronées
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
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 .