Список SwiftUI не обновляется при применении listRowInsets

Цель

Обновляйте данные за List одним нажатием

Проблема

Когда .listRowInsets применяются к строкам списка, список перестает получать обновления при изменении состояния.

Код

struct ContentView: View {
    
    private var array = ["a", "b", "c"]
    @State private var selectedIndex = 0
    
    var body: some View {
        makeBody()
    }
    
    private func makeRow(_ t: String, index: Int) -> some View {
        return HStack {
            Text(t)
            Spacer()
            if selectedIndex == index {
                Image(systemName: "checkmark.circle")
            }
        }
        .contentShape(Rectangle())
        .onTapGesture {
            print("selected \(index)")
            self.selectedIndex = index
        }
    }
    
    private func makeBody() -> some View {
        return List {
            ForEach(0..<array.count) { i in
                self.makeRow(self.array[i], index: i)
                    // comment and uncomment this line
                    // .listRowInsets(EdgeInsets(top: 16, leading: 20, bottom: 16, trailing: 20))
            }
        }
    }
}

Вопрос

Это ошибка? Или я что-то упускаю?


person youjin    schedule 30.06.2020    source источник


Ответы (1)


Если ваши данные можно изменить, вам понадобится динамический ForEach цикл (с явным параметром id):

ForEach(0..<array.count, id:\.self) { i in // <- add `id:\.self`
    self.makeRow(self.array[i], index: i)
         .listRowInsets(EdgeInsets(top: 16, leading: 20, bottom: 16, trailing: 20))
}

Однако это плохо задокументировано. В некоторых случаях Xcode предупреждает вас, когда вы пытаетесь изменить массив, используемый в цикле ForEach:

ForEach(_:content:) следует использовать только для постоянных данных. Вместо этого приведите данные в соответствие с Identifiable или используйте ForEach(_:id:content:) и укажите явное id!

person pawello2222    schedule 30.06.2020
comment
Это работает! У вас есть источник для этого? Я ничего не нашел относительно параметра id и динамического _2 _... - person youjin; 01.07.2020
comment
@youjin Верно, в документации Apple ничего явного найти не удалось. Может я что-то упустил. В любом случае я добавил предупреждение Xcode, которое дает хорошее объяснение. - person pawello2222; 01.07.2020