почему SwiftUI не обновляет значения во вложенном ForEach L oop? - PullRequest
1 голос
/ 07 мая 2020

у меня есть этот код. это довольно просто. я меняю строки на одну при нажатии кнопки.

но работает только вывод в строке «работает», другой всегда равен 0.

Что я делаю не так!?

вы можете скопировать и вставить код, чтобы воспроизвести ошибку.

class GlobalData : ObservableObject {

    @Published var rows : Int = 0
}


struct ContentView: View {

    @ObservedObject var globalData = GlobalData()

    var body: some View {
        VStack {
            Text("\(self.globalData.rows)") // works...
            ForEach (0..<4) { y in
                HStack () {
                    ForEach (0..<3) { x in

                        ForEach (0..<3) { index -> Text in
                            Text("\(self.globalData.rows)") // shows always 0
                        }
                    }
                }
            }
            Button(action: {
                self.globalData.rows = self.globalData.rows + 1
            }) {
                Text("Increase rows")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

1 Ответ

2 голосов
/ 07 мая 2020

Причина в постоянной ForEach(range). Если предполагается, что что-то изменилось внутри ForEach, используйте динамическую c последовательность данных.

Вот решение для вашего случая. Протестировано с Xcode 11.4 / iOS 13.4.

struct ContentView: View {

    @ObservedObject var globalData = GlobalData()

    var body: some View {
        VStack {
            Text("\(self.globalData.rows)") // works...
            ForEach (Array(0...3), id: \.self) { y in
                HStack () {
                    ForEach (Array(0...2), id: \.self) { x in

                        ForEach (Array(0...2), id: \.self) { index -> Text in
                            Text("\(self.globalData.rows)") // works ...
                        }
                    }
                }
            }
            Button(action: {
                self.globalData.rows = self.globalData.rows + 1
            }) {
                Text("Increase rows")
            }
        }
    }
}
...