0

我正在与 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

            ...
4

0 回答 0