У меня есть очень простой школьный пример представления списка SwiftUI, которое отображает элементы из данных в массиве. Данные в массиве идентифицируемы. Но когда я изменяю данные в массиве, добавляю или удаляю элемент, все строки в представлении списка воссоздаются. Это правильно? Насколько я понимаю, Identifiable должен гарантировать, что воссоздается только представление в списке, которое было изменено.
Мой список находится внутри представления навигации, и каждая строка связана с подробным представлением. Проблема в том, что, поскольку все элементы в списке удаляются и воссоздаются каждый раз при изменении данных, то, если это происходит, когда Im в подробном представлении (оно запускается уведомлением), то Im выбрасывается обратно в список.
Что мне не хватает?
Изменить: добавлен пример кода
Это моя структура данных:
struct Item: Identifiable {
let id: UUID
let name: String
init(name: String) {
self.id = UUID()
self.name = name
}
}
Это мой ItemView
struct ItemView: View {
var item: Item
init(item: Item) {
self.item = item
print("ItemView created \(self.item.id)")
}
var body: some View {
Text(self.item.name)
}
}
Наконец, мой список:
struct KeyList: View {
@State var items = [Item(name: "123"), Item(name: "456"), Item(name: "789")]
var body: some View {
VStack {
List(self.items) { item in
ItemView(item: item)
}
Button(action: {
self.items.append(Item(name: "New"))
}) {
Text("Add")
}
}
}
}
Когда я нажимаю кнопку добавления, он 4 раза напечатает «ItemView created». Насколько я понимаю, это следует делать только 1 раз?