Neden @ Yayımlanmış Metin güncelleniyor ama Liste güncellenmiyor?
Text
Güncellemelerin nedenini anlamıyorum ama List
olmuyor.
Tarih @Published
dizisi olan bir modelim var . Tarihlerden metin üretmenin bir yöntemi de var.
İşte basitleştirilmiş bir sürüm:
class DataModel: NSObject, ObservableObject {
@Published var selectedDates: [Date] = []
func summary() -> String {
var lines: [String] = []
for date in selectedDates.sorted().reversed() {
let l = "\(someOtherStuff) \(date.dateFormatted)"
lines.append(l)
}
return lines.joined(separator: "\n")
}
}
Ve bu metni kendi görüşüme göre gösteriyorum. İşte basitleştirilmiş bir sürüm:
struct DataView: View {
@ObservedObject var model: DataModel
var body: some View {
ScrollView {
Text(model.summary())
}
}
}
Çalışır: Kullanıcı, Görünümdeki UI'den bir tarih eklediğinde model.selectedDates
, özet metni düzgün şekilde güncellenir.
Şimdi metni bir Satır Listesi ile değiştirmek istiyorum.
Yöntemi değiştiriyorum:
func summary() -> [String] {
var lines: [String] = []
for date in selectedDates.sorted().reversed() {
let l = "\(someOtherStuff) \(date.dateFormatted)"
lines.append(l)
}
return lines
}
Ve görünümü değiştirin:
var body: some View {
ScrollView {
List {
ForEach(model.summary(), id: \.self) { line in
Text(line)
}
}
}
}
Ancak bu işe yaramıyor: Listede hiç metin yok, kullanıcı bir tarih eklediğinde asla güncellenmiyor model.selectedDates
.
Neyi yanlış yapıyorum?
Yanıtlar
SO'daki önceki bir gönderiye bu cevabı bulabildim ki bu , probleminizin çözümü olabilir. Listede hiç metin olmadığını söylediğinizde, bunu doğrulamak için hata ayıkladınız mı yoksa ekranda hiçbir veri gösterilmiyor muydu?
Kod parçacığınızın bir kopyasını oluşturduğumda ve onunla uğraştığımda, Listenin ekranda göstermeye çalıştığı verilerin gerçekte olduğu, ancak Listenin çerçevesi Scrollview tarafından geçersiz kılındığı görüldü. Her şeyi bir GeometryReader içine yerleştirmek ve Listeye bir çerçeve boyutu vermek, programa aradığınız gibi görünen işlevselliği sağladı.
Verileriniz için ScrollView veya Liste kullanın. Bir Listenin birden fazla değeri varsa, otomatik olarak kaydırılabilir bir Listeye dönüşür. Bu yüzden, ScrollView'ı tamamen kaldırabileceğinize inanıyorum.
İşte sabit çalışılmış bir varyant (bazı replikasyonlarla - bu yüzden onu projenize uyarlamanız gerekir).
Xcode 12.1 / iOS 14.1 ile test edildi
class DataModel: NSObject, ObservableObject {
@Published var selectedDates: [Date] = []
func summary() -> [String] {
var lines: [String] = []
for date in selectedDates.sorted().reversed() {
let l = "someOtherStuff \(date)"
lines.append(l)
}
return lines
}
}
struct DataView: View {
@ObservedObject var model: DateDataModel = DataModel()
var body: some View {
VStack {
Button("Add") { model.selectedDates.append(Date())}
List {
ForEach(model.summary(), id: \.self) { line in
Text(line)
}
}
}
}
}