0

I am trying to create a sidebar that contains multiple DisclosureGroups where some of them contain a nested list. The whole sidebar when fully expanded will be longer than the screen, so it needs to scroll.

My test code for macOS looks like this:

import SwiftUI

class MenuItem: Identifiable {
    var id = UUID()
    var text : String
    var children : [MenuItem]? = [MenuItem]()
    
    init(text: String) {
        self.text = text
    }
}

struct ContentView: View {
    
    var menuItems = [MenuItem]()
    
    init() {
        for itemText in ["One", "Two", "Three", "Four", "Five"] {
            menuItems.append(MenuItem(text: itemText))
        }
        for item in menuItems {
            for childText in ["A", "B", "C", "D", "E"] {
                item.children?.append(MenuItem(text: childText))
            }
        }
    }
        
    var body: some View {
        ScrollView {
            DisclosureGroup("Section 1") {
                List(menuItems, children: \.children) { item in
                    Text(item.text)
                }            }
            DisclosureGroup("Section 2") {
                Text("Some other stuff")
            }
            DisclosureGroup("Section 3") {
                List(menuItems, children: \.children) { item in
                    Text(item.text)
                }.frame(minHeight: 300)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

The problem with this code is that Section 2 expands as expected, while section 1 does not expand at all. I can make a nested list show up by giving it a fixed frame (like in section 3), but then I get a scrolling list within a scrolling sidebar and the frame does not adjust to the size of the expanded nested list.

My aim is to have one big scrolling sidebar with three DisclosureGroups that collapses, expands and scrolls as one unit.

jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
The Lone Coder
  • 3,062
  • 4
  • 20
  • 35

0 Answers0