我正在与 SwiftUI 中的一个披露小组合作。默认情况下,它会显示披露指示器,但它是您唯一可以点击以显示内容的东西。我希望能够点击标签“行”来切换披露。我设置了一个“sectionBindingManager”和一个“sectionBinding”函数,我可以在其中将默认值(有效)设置为真或假,但我无法切换披露。我错过了什么?
编码:
class SectionBindingManager<T>: ObservableObject {
private var bindings: [UUID: Binding<T>] = [:]
private var bindingValues: [UUID: T] = [:]
func binding(for id: UUID, defaultValue: T) -> Binding<T> {
if let binding = bindings[id] {
return binding
} else {
bindingValues[id] = defaultValue
let newBinding = Binding<T> {
return self.bindingValues[id] ?? defaultValue
} set: { value in
self.bindingValues[id] = value
}
bindings[id] = newBinding
return newBinding
}
}
}
...
struct CuisineListView: View {
// MARK: - Properties
@EnvironmentObject var dataController: DataController
@EnvironmentObject var sectionBindingManager: SectionBindingManager<Bool>
...
private func sectionBinding(for id: UUID?) -> Binding<Bool> {
guard let id = id else {
return Binding<Bool> {
return true
} set: { value in
return
}
}
return sectionBindingManager.binding(for: id, defaultValue: false)
}
...
var body: some View {
Group {
List {
ForEach(cuisines, id: \.id) { cuisine in
DisclosureGroup(isExpanded: sectionBinding(for: cuisine.id)) {
ForEach(cuisine.sortedDishTypes(), id: \.id) { dishType in
NavigationLink(destination: RecipeListView(cuisine: cuisine, selectedDishType: dishType)) {
Text(dishType.name!)
.padding(.leading, 20)
}
}
} label: {
// Header
HStack {
Image(cuisine.icon ?? "North American")
.resizable()
.scaledToFit()
.frame(width: 24, height: 24)
Text(cuisine.name!)
.font(.headline)
.fontWeight(.semibold)
.padding(.leading, 5)
Spacer()
}
.contentShape(Rectangle())
.onTapGesture {
withAnimation {
isExpanded.toggle()
}
}
}
} //: LOOP
...