Swiftui 为什么@Binding属性每次都会导致不相关的init?
这是一个让我困惑了一整天的bug,我为我的案例做了一个演示,所有的只是一个列表和一个细节 房间。swiftSwiftui 为什么@Binding属性每次都会导致不相关的init?,swiftui,combine,Swiftui,Combine,这是一个让我困惑了一整天的bug,我为我的案例做了一个演示,所有的只是一个列表和一个细节 房间。swift struct Room: Identifiable { var id: Int var name: String } class RoomListModel: ObservableObject { @Published var rooms: [Room] = [ Room(id: 1, name: "Room A"), Room(
struct Room: Identifiable {
var id: Int
var name: String
}
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"),
]
}
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() )
}
}
}
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)
}
}
}
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)
}
}
RoomListModel.swift
struct Room: Identifiable {
var id: Int
var name: String
}
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"),
]
}
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() )
}
}
}
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)
}
}
}
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)
}
}
RoomList.swift
struct Room: Identifiable {
var id: Int
var name: String
}
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"),
]
}
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() )
}
}
}
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)
}
}
}
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)
}
}
RoomRow.swift
struct Room: Identifiable {
var id: Int
var name: String
}
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"),
]
}
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() )
}
}
}
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)
}
}
}
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)
}
}
但是当我触发RowDetail中的一个时,所有的RoomDetails都会被再次初始化,但我只会转到其中一个,而不是所有的,为什么所有的RoomDetails都会被初始化,然后再次
initing RoomDetail: Room C
initing RoomDetail: Room A
initing RoomDetail: Room B
我不知道为什么,但找到了一个解决方案,我删除了所有@Binding属性,这没问题,但是为什么
@Binding
会导致未还原的初始化?无法重现这个问题,使用Xcode 11.0和iOS 13一切都很好。@eloss我刚才检查过,Xcode是11.1,iOS是13.1,我上传了一个演示,请重试。