Lembar SwiftUI menunjukkan lembar dengan data yang salah

Aug 15 2020

Saya memiliki daftar yang menampilkan 1, 2, dan 3. Ketika teks diketuk, aplikasi membuka lembar dengan nomor yang disadap. Namun, jika saya mengetuk teks di baris kedua atau ketiga, angka yang ditampilkan di lembar tetap 1. Apa yang saya lakukan salah?

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

Jawaban

pawello2222 Aug 15 2020 at 20:37

Anda perlu membuat satu lembar, bukan beberapa lembar.

Jika Anda ingin menggunakan .sheet(isPresented:content:)Anda dapat melakukan hal berikut:

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 }
        )
    }
}

Atau Anda dapat menggunakan .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)")
        }
    }
}

EDIT

Jika Anda memutuskan untuk menggunakan, .sheet(item:content:)Anda dapat menambahkan ekstensi ke Int(alih-alih membuat struct kustom yang sesuai dengan Identifiable):

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

seperti yang dikemukakan dalam jawaban Asperi .