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 .