Это ошибка, смущающая меня на весь день, я делаю демо для моего случая, все это просто список и детали.
Room.swift
struct Room: Identifiable {
var id: Int
var name: String
}
RoomListModel.swift
class RoomListModel: ObservableObject {
@Published var rooms: [Room] = [
Room(id: 1, name: "Room A"),
Room(id: 2, name: "Room B"),
Room(id: 3, name: "Room C"),
]
}
RoomList.swift
struct RoomList: View {
@ObservedObject var model = RoomListModel()
var body: some View {
NavigationView {
List {
ForEach(model.rooms.indices) { index in
RoomRow(room: self.$model.rooms[index])
}
}
.listStyle( GroupedListStyle() )
}
}
}
RoomRow.swift
struct RoomRow: View {
@Binding var room: Room
init(room: Binding<Room>) {
print("initing RoomRow: " + room.name.wrappedValue)
self._room = room
}
var body: some View {
NavigationLink(
destination: RoomDetail(room: $room)
) {
Text(room.name)
}
}
}
RoomDetail.swift
struct RoomDetail: View {
@Binding var room: Room
init(room: Binding<Room>) {
print("initing RoomDetail: " + room.name.wrappedValue)
self._room = room
}
var body: some View {
Text(room.name)
}
}
Для удобства я добавляю печать в init.
При загрузке списка все RoomRow и RoomDetailэто нормально.
initing RoomRow: Room A
initing RoomDetail: Room A
initing RoomRow: Room B
initing RoomDetail: Room B
initing RoomRow: Room C
Но когда я запускаю один из RowDetail, все RoomDetails снова включаются, но я просто иду к одному, а не ко всем, WHY все RoomDetails инициализируются, и ОПЯТЬ ?
initing RoomDetail: Room C
initing RoomDetail: Room A
initing RoomDetail: Room B
Я не знаю почему, но нашел одно решение, я удалил все свойство @Binding, и все нормально, но ПОЧЕМУ @Binding
вызовет непересоединенный init?