【问题标题】:Dynamic view rendering, SwiftUI动态视图渲染,SwiftUI
【发布时间】:2020-12-16 00:33:19
【问题描述】:

假设我有一个结构:

var topMenu: [TopMenu] = [TopMenu(name: "Menu", index: 1),
                      TopMenu(name: "Search", index: 2),
                      TopMenu(name: "Profile", index: 3),
                      TopMenu(name: "Settings", index: 4)]

这个结构包含一个字符串和一个索引,所以我可以使用这些元素创建一个基于 HStack 和 ForEach 的菜单。这可以。但我现在要做的是:

假设这个结构是动态的:我可以有 3 个元素,但我也可以有 5/6 个元素(基于后端调用)。我想为每个元素呈现不同的视图(点击时)。目前,我正在根据我们的索引使用简单的 if 来执行此操作:

if self.index == 1 {
      First()
} else if self.index == 2 {
      Second()
} else if self.index == 3 {
      Third()
} else {
      First()
}

但如果我有更多元素等,这不是最好的方法......

我的想法如下,但我不知道最好的方法是什么:

  • 创建一个基于索引返回Any View 的函数,并为每个视图指定一个默认名称,以便我可以迭代?比如 View1、View2 等?

  • 为我的结构添加一些特殊的东西?

附:我也想以更安全的方式做到这一点,我不想崩溃等! =)

谢谢!

【问题讨论】:

    标签: ios performance struct view swiftui


    【解决方案1】:

    这是 SwiftUI 2.0 中可能的方法(在 SwiftUI 1.0 中,ViewBuilder 尚不支持 switch,因此 if/else 是唯一的方法,但您也可以将其包装在 enum 中)。

    enum Choices: Int {
        case menu = 1
        case search = 2
        case profile = 3
        case settings = 4
    
        @ViewBuilder
        func view() -> some View {
            switch self {
                case menu:
                    MenuView()
                case search:
                    SearchView()
                case profile:
                    ProfileView()
                case settings:
                    SettingsView()
            }
        }
    }
    
    struct DemoChoicesUsage: View {
        @State var index = 1
        var body: some View {
            VStack {
                (Choices(rawValue: index) ?? Choices.menu).view()
            }
        }
    }
    

    此外,您还可以选择修改 TopMenu 以直接链接到枚举案例而不是索引,例如 TopMenu(name: "Menu", tag: .menu)

    struct TopMenu {
      let name: String
      let tag: Choices
    }
    

    【讨论】:

    • 非常感谢您的回答!这很好,但我仍然从我的问题中遗漏了一些东西:如果(在后端调用之后)我发现假设有 6 个视图,其中包含 4 个视图?我想我需要一些更有活力的东西!还是我的问题很奇怪?
    • 有多少视图无关紧要 - 无论如何,您都需要声明它们并在某处创建它们。
    • 好的,这是正确的。所以我设置了一个限制,比如说最多 6 个视图,然后我创建了所有视图。我只渲染我需要的。请问,我该如何使用这个奇妙的枚举?我的意思是,目前我在 VStack 中有 if 语句,其中包含 HStack 和我们的菜单、搜索、设置(带索引)等。但是当我点击其中一个时,我如何使用枚举来呈现正确的视图?
    • 谢谢你,我真的很感激,这就是我要找的。​​span>
    • 我们有可能遗漏了什么吗?我刚刚测试了代码,并通过像 (Choices.menu).view() 这样的简单检查来查看它是否有效,没有发生任何事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多