SwiftUI sayfası yanlış veriye sahip sayfayı gösteriyor
Aug 15 2020
1, 2 ve 3'ü görüntüleyen bir listem var. Metne dokunduğumda, uygulama numaraya dokunulan bir sayfa açar. Bununla birlikte, ikinci veya üçüncü satırdaki metne dokunursam, sayfada görüntülenen sayı hala 1'dir. Neyi yanlış yapıyorum?
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()
}
}
}
}
Yanıtlar
pawello2222 Aug 15 2020 at 20:37
Birden çok sayfa yerine bir sayfa oluşturmanız gerekir .
Kullanmak isterseniz .sheet(isPresented:content:)
şunları yapabilirsiniz:
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 }
)
}
}
Alternatif olarak şunları kullanabilirsiniz .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)")
}
}
}
DÜZENLE
Kullanmaya karar verirseniz, .sheet(item:content:)
bir uzantı ekleyebilirsiniz Int
(uyan özel bir yapı oluşturmak yerine Identifiable
):
extension Int: Identifiable {
public var id: Int { self }
}
Asperi'nin cevabında önerildiği gibi .
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'