Я думаю, что нашел решение.Первая проблема состояла в том, что я инициализировал массив цветов, повторяя один и тот же элемент вместо добавления независимых.
Более того, CustomColor
само должно иметь BindableObject
соответствие, а не модель (мы не меняеммассив цветов мы меняем каждый цвет).Наконец, нам не нужно оборачивать объекты в элемент ForEach (таким образом мы теряем возможность повторного использования), и вместо этого мы помещаем их в элемент List .
С этимреализации, будет перерисован только вид, который был изменен, а не вся коллекция.
Вот код:
class CustomColor: BindableObject, Identifiable {
var didChange = PassthroughSubject<CustomColor, Never>()
let id = UUID()
var color: Color {
didSet {
self.didChange.send(self)
}
}
init(color: Color) {
self.color = color
}
func change(toColor color: Color) {
self.color = color
}
}
class ColorStore {
var colors: [CustomColor] = []
init() {
(0...10).forEach { _ in colors.append(CustomColor(color: .red)) }
}
}
struct ContentView: View {
let colorStore: ColorStore
var body: some View {
NavigationView {
List(colorStore.colors) { color in
ColorShape(color: color)
}.navigationBarTitle(Text("Colors"))
}
}
}
struct ColorShape: View {
@ObjectBinding var color: CustomColor
var body: some View {
Button(action: { self.color.change(toColor: .blue) }, label: {
ShapeView(shape: Circle(), style: color.color)
})
}
}