SwiftUI-Blatt zeigt Blatt mit falschen Daten
Aug 15 2020
Ich habe eine Liste mit 1, 2 und 3. Wenn Sie auf den Text tippen, öffnet die App ein Blatt mit der tippenden Nummer. Wenn ich jedoch auf den Text in der zweiten oder dritten Zeile tippe, ist die auf dem Blatt angezeigte Nummer immer noch 1. Was mache ich falsch?
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()
}
}
}
}
Antworten
pawello2222 Aug 15 2020 at 20:37
Sie müssen ein Blatt anstelle mehrerer Blätter erstellen .
Wenn Sie verwenden möchten, .sheet(isPresented:content:)
können Sie Folgendes tun:
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 }
)
}
}
Alternativ können Sie verwenden .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)")
}
}
}
BEARBEITEN
Wenn Sie sich für die Verwendung entscheiden, .sheet(item:content:)
können Sie eine Erweiterung hinzufügen Int
(anstatt eine benutzerdefinierte Struktur gemäß zu erstellen Identifiable
):
extension Int: Identifiable {
public var id: Int { self }
}
wie in Asperis Antwort vorgeschlagen .