Я пытаюсь отобразить список элементов в подпредставлении (ListView
) внутри ContainerView
всякий раз, когда значение массива этих элементов не равно nil
. Каждый раз, когда массив обновляется, должен отображаться новый ListView
, заменяющий предыдущий или удаляемый, если массив равен nil
. Проблема в том, что ListView
, кажется, отображается, удаляется и корректно обновляется, за исключением ForEach
l oop. Он использует один и тот же диапазон каждый раз, даже если кажется, что отображается новый ListView
.
Я создал простой пример, чтобы продемонстрировать проблему. Это ContainerView
:
struct ContainerView: View {
@State private var items: [Int]?
private var listView: some View {
items.map { ListView(items: $0) }
}
var body: some View {
VStack {
Button("Display new List") { self.items = self.randomItems() }
listView
}
}
private func randomItems() -> [Int] {...}
}
Это ListView
:
struct ListView: View {
private let randomInt: Int
private let items: [Int]
init(randomInt: Int = Int.random(in: 100 ..< 999), items: [Int]) {
self.randomInt = randomInt
self.items = items
print("init | items: \(items)")
}
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Text("\(randomInt)")
ForEach(0 ..< items.count) { index -> Text? in
print("ForEach | index: \(index) items.count: \(self.items.count)")
return self.items.count > index ? Text("\(self.items[index])") : nil
}
}
}
}
При запуске и нажатии кнопки «Показать новый список» несколько раз будет напечатано что-то как это:
init | items: [0, 1, 2]
ForEach | index: 0 items.count: 3
ForEach | index: 1 items.count: 3
ForEach | index: 2 items.count: 3
init | items: [0, 1, 2, 3, 4, 5, 6, 7, 8]
ForEach | index: 0 items.count: 9
ForEach | index: 1 items.count: 9
ForEach | index: 2 items.count: 9
init | items: [0, 1, 2, 3, 4, 5]
ForEach | index: 0 items.count: 6
ForEach | index: 1 items.count: 6
ForEach | index: 2 items.count: 6
Итак, очевидно, создается новый ListView
, и на устройстве вы также видите, что отображается правильный randomInt
, но по какой-то причине ForEach
использует один и тот же диапазон каждый время независимо от длины нового массива.
Почему диапазон не обновляется или как заставить его обновиться?