Ios 动态视图渲染,SwiftUI
假设我有一个结构:Ios 动态视图渲染,SwiftUI,ios,performance,struct,view,swiftui,Ios,Performance,Struct,View,Swiftui,假设我有一个结构: var topMenu: [TopMenu] = [TopMenu(name: "Menu", index: 1), TopMenu(name: "Search", index: 2), TopMenu(name: "Profile", index: 3), TopMenu(name:
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()
}
但是如果我有更多的元素等,这不是最好的方法
我的想法如下,但我不知道最好的方法是什么:
- 创建一个函数,该函数根据索引返回
,并为每个视图指定一个默认名称,以便我可以迭代?例如View1、View2等任何视图
- 在我的结构中添加特定的内容
谢谢大家! 这里是SwiftUI 2.0中可能的方法(在SwiftUI 1.0中,ViewBuilder尚不支持
开关
,因此if/else
是唯一的方法,但您也可以将其包装在枚举
中)
此外,您还可以选择修改TopMenu
,将其直接链接到枚举案例,而不是索引,如TopMenu(名称:“Menu”,标记:.Menu)
非常感谢您的回答!这很好,但我的问题中仍然遗漏了一些东西:如果(在后端调用之后)我发现有6个视图而不是4个视图,该怎么办?我想我需要更有活力的东西!还是我的问题很奇怪?不管有多少视图,你都需要声明它们并在某处创建它们。好的,这是正确的。所以我设置了一个限制,比如说最大6个视图,然后我创建了所有视图。我只渲染我需要的。请问,我该如何使用这个奇妙的枚举?我的意思是,目前我在一个VStack中有if语句,它包含了带有菜单、搜索、设置(带索引)等的HStack。但是当我点击其中一个时,我该如何使用枚举来呈现正确的视图?谢谢你,伙计,我真的很抱歉,这就是我一直在寻找的。有可能我们遗漏了什么吗?我刚刚测试了代码,并通过一个简单的检查,比如(Choices.menu).view()来检查它是否有效,但什么都没有发生
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()
}
}
}
struct TopMenu {
let name: String
let tag: Choices
}