我真的很难理解
我正在分析苹果示例代码,位于https://developer.apple.com/documentation/swiftui/building_a_great_mac_app_with_swiftui。
项目是
左侧有侧边栏,右侧有主要的详细视图。
List(selection:)
如何导致选择绑定的更新。我正在分析苹果示例代码,位于https://developer.apple.com/documentation/swiftui/building_a_great_mac_app_with_swiftui。
项目是
Session2/Part2-End/GardenApp.xcodeproj
。左侧有侧边栏,右侧有主要的详细视图。
ContentView
看起来像这样:struct ContentView: View {
@EnvironmentObject var store: Store
@SceneStorage("selection") private var selectedGardenID: Garden.ID?
@AppStorage("defaultGarden") private var defaultGardenID: Garden.ID?
var body: some View {
NavigationView {
Sidebar(selection: selection)
GardenDetail(garden: selectedGarden)
}
}
private var selection: Binding<Garden.ID?> {
Binding(get: { selectedGardenID ?? defaultGardenID }, set: { selectedGardenID = $0 })
}
private var selectedGarden: Binding<Garden> {
$store[selection.wrappedValue]
}
}
并且侧边栏看起来像这样:
struct Sidebar: View {
@EnvironmentObject var store: Store
@SceneStorage("expansionState") var expansionState = ExpansionState()
@Binding var selection: Garden.ID?
var body: some View {
List(selection: $selection) {
DisclosureGroup(isExpanded: $expansionState[store.currentYear]) {
ForEach(store.gardens(in: store.currentYear)) { garden in
SidebarLabel(garden: garden)
.badge(garden.numberOfPlantsNeedingWater)
}
} label: {
Label("Current", systemImage: "chart.bar.doc.horizontal")
}
Section("History") {
GardenHistoryOutline(range: store.previousYears, expansionState: $expansionState)
}
}
.frame(minWidth: 250)
}
}
SidebarLabel
视图现在没有任何对选择绑定的引用;但是,当您点击其中一个标签时,选择会更新并且绑定会传播到ContentView
,从而使GardenDetail
视图使用新选择进行更新。
我的问题是:点击侧边栏项目中的一个如何导致选择绑定被更新,因为没有对选择绑定的引用?是否与 ForEach
有关?
如果是,如何添加不参与此类循环的“即席”项?如果不是,发生了什么?
List(d: \.self, selection: $selection))
- Raja Kishan