How to have a dynamic List of Views using SwiftUI

后端 未结 8 2030
被撕碎了的回忆
被撕碎了的回忆 2020-12-05 02:44

I can do a static List like

List {
   View1()
   View2()
}

But how do i make a dynamic list of elements from an array? I tried the followin

8条回答
  •  旧巷少年郎
    2020-12-05 02:54

    You can use dynamic list of subviews, but you need to be careful with the types and the instantiation. For reference, this is a demo a dynamic 'hamburger' here, github/swiftui_hamburger.

    // Pages View to select current page
    /// This could be refactored into the top level
    struct Pages: View {
        @Binding var currentPage: Int
        var pageArray: [AnyView]
    
        var body: AnyView {
            return pageArray[currentPage]
        }
    }
    
    // Top Level View
    /// Create two sub-views which, critially, need to be cast to AnyView() structs
    /// Pages View then dynamically presents the subviews, based on currentPage state
    struct ContentView: View {
        @State var currentPage: Int = 0
    
        let page0 = AnyView(
            NavigationView {
                VStack {
                    Text("Page Menu").color(.black)
    
                    List(["1", "2", "3", "4", "5"].identified(by: \.self)) { row in
                        Text(row)
                    }.navigationBarTitle(Text("A Page"), displayMode: .large)
                }
            }
        )
    
        let page1 = AnyView(
            NavigationView {
                VStack {
                    Text("Another Page Menu").color(.black)
    
                    List(["A", "B", "C", "D", "E"].identified(by: \.self)) { row in
                        Text(row)
                    }.navigationBarTitle(Text("A Second Page"), displayMode: .large)
                }
            }
        )
    
        var body: some View {
            let pageArray: [AnyView] = [page0, page1]
    
            return Pages(currentPage: self.$currentPage, pageArray: pageArray)
    
        }
    }
    

提交回复
热议问题