Lembar SwiftUI menunjukkan lembar dengan data yang salah
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
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 .
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'