欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SwiftUI NavigationView和List的使用

程序员文章站 2024-03-24 13:04:22
...

稍微了解一点SwiftUI的都知道,SwiftUI中一些控件的子视图数量(⚠️这里说的数量是指写成特别死的一个一个子视图)是有限制的,一般不超过10
例如:
VStack
HStack
ZStack
Group
List
未来的容器

本博客就是一个记录关于List中子视图数量超过10个的解决方案

我这里结合了NavigationLink的使用,一般在网上找到的都是同一个视图循环,向里面塞内容,我这里有点特殊,每一个导航进去的新视图都是一个单独swift文件,实现的时候遇到的问题是每一个视图不知道用什么类型,后来查了很多地方才找到解决方法。使用AnyView类型的擦除包装器,另外创建对象的时候需要显式使用AnyView

//
//  VLAPUIView.swift
//  SwiftUI_Base
//
//  Created by 先森 L on 2021/5/9.
//

import SwiftUI
struct MyLink: Identifiable{
    var id = UUID()
    let linkName: String
    //下面使用AnyView类型的擦除包装器
    let linkView: AnyView
}
struct NLinks{
    var links: [MyLink]
}

struct VLAPUIView: View {
    var nLinks = NLinks(links: [
        //下面创建对象是需要显式使用AnyView
        MyLink(linkName: "Stacks 和 Lazy Stacks", linkView: AnyView(StacksUIView())),
        MyLink(linkName: "Grids", linkView: AnyView(GridsUIView())),
        MyLink(linkName: "Displaying Data in Lists", linkView: AnyView(DataInListsUIView())),
        MyLink(linkName: "Lists and Scroll Views", linkView: AnyView(ListsAndScrollUIView())),
        MyLink(linkName: "Container Views(Form)", linkView: AnyView(CV_FormUIView())),
        MyLink(linkName: "Container Views(Group)", linkView: AnyView(CV_GroupUIView())),
        MyLink(linkName: "Container Views(GroupBox)", linkView: AnyView(CV_GroupBoxUIView())),
        MyLink(linkName: "Container Views(Section)", linkView: AnyView(CV_SectionUIView())),
        MyLink(linkName: "Hierarchical Views", linkView: AnyView(HierarchicalUIView())),
        MyLink(linkName: "Architectural Views", linkView: AnyView(ArchitecturalUIView())),
        MyLink(linkName: "Presentations", linkView: AnyView(PresentationsUIView()))
    ])
    
    var body: some View {
        List{
            ForEach(nLinks.links){link in
                NavigationLink(
                    destination: link.linkView,
                    label: {
                        Text(link.linkName)
                    })
            }
        }
        .navigationBarTitle(Text("View Layout And Pressentation"))
    }
}

struct VLAPUIView_Previews: PreviewProvider {
    static var previews: some View {
        VLAPUIView()
    }
}

相关标签: SwiftUI ios swift