【问题标题】:How to create SwiftUI List of NavigationLinks with dynamic view names如何使用动态视图名称创建 SwiftUI 导航链接列表
【发布时间】:2020-07-20 20:08:13
【问题描述】:

我正在尝试创建一个简单的视图列表供用户访问,但我不知道如何用数组变量替换视图名称。在下面的示例中,destination: 被硬编码为 AVExample(),这是我的视图之一,但是如何使用数组中的名称?

struct test: View {
    
   var views = ["AVExample", "ColorPickerExample", "DatePickerExample"]
   
    var body: some View {
        
        NavigationView {
            List (views, id: \.self){ view in
                
                NavigationLink(
                    destination: AVExample(),
                    label: {
                        Text("\(view)")
                    })
            }
        }
    }
}

【问题讨论】:

  • 静态类型检查不允许你这样做,相反你可以使用类似于provided here的方法
  • 你为什么不使用字典呢? ["AVExample": AVExample(), "ColorPickerExample": ColorPickerExample(), "DatePickerExample": DatePickerExample()]

标签: swiftui navigationlink


【解决方案1】:

您可以为视图创建一个结构,然后使用该结构数组。例如:

 struct ViewsList: Identifiable {
    static func == (lhs: ViewsList, rhs: ViewsList) -> Bool {
        return lhs.id == rhs.id
    }
    
    var id: Int
    var name: String
    var viewContent: AnyView
}

然后在您的视图类(测试)中,创建一个 ViewList 结构数组:

var views = [ViewsList.init(id: 1, name: "Example", viewContent: AnyView(AVExample())), ViewsList.init(id: 2, name: "ColorPicker", viewContent: AnyView(ColorPicker()))]

然后你可以循环这个数组如下:

NavigationView {
            List (views, id: \.id){ view in
                
             NavigationLink(
                  destination: view.viewContent,
                  label: {
                        Text("\(view.name)")
             })
  }

【讨论】:

    【解决方案2】:

    非常感谢您的回复。我想出了以下似乎效果很好的解决方案。

    private struct aView {
        var id = UUID()
        var view: AnyView
        var label: String
    }
    
    private var views = [
        aView(view: AnyView(AppStorageExample()), label: "App Storage"),
        aView(view: AnyView(AppStoreRecommend()), label: "App Store Recommended"),
        aView(view: AnyView(AVExample()), label: "AV Player"),
        aView(view: AnyView(ColorPickerExample()), label: "Color Picker"),
    ]
    
    var body: some View {
            List (views, id: \.id) { view in
                NavigationLink(
                    destination: view.view,
                    label: {
                        Text("\(view.label)")
                    })
            }
    

    }

    【讨论】:

    • 那怎么传参数呢?
    猜你喜欢
    • 2022-01-01
    • 2020-09-30
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2022-01-16
    • 2019-10-31
    • 2020-05-28
    相关资源
    最近更新 更多