【发布时间】:2020-08-09 21:37:52
【问题描述】:
我正在尝试构建一个非常简单的 SwiftUI 程序来轻松交换视图。目标是尽可能简单地添加更多视图,而无需更改确定哪个视图的代码(因此标准的if-else 不起作用)。
我目前的想法是保留一个字典,其中包含作为键值对的一部分存储的视图。一个非常基本的实现示例如下:
import SwiftUI
struct ViewA: View {
var body: some View {
Text("This is View A")
}
}
struct ViewB: View {
var body: some View {
Text("This is View B")
}
}
struct MainView: View {
var subviews: [String:View] = [
"View-1": ViewA(),
"View-2": ViewB(),
]
var body: some View {
self.subviews["View-1"]
}
}
但是,我在创建字典的行中遇到错误:Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements。
我已经为字典的值部分尝试了许多不同的类型,包括AnyView、Groups,并在 MainView 结构上创建了一个泛型类型<Content: View>。然而,这些会产生更多/不同的错误。
我查看了SwiftUIRouter 项目,因为它解决了我想要实现的目标,但我的目标更加简单。
提前致谢。
【问题讨论】:
-
AnyView应该可以工作,但您需要将任何视图包装在AnyView(ViewA())中以存储它。 -
谢谢!唯一的问题是我读到 AnyView 效率不高。您认为它会以明显的方式影响性能吗?
-
我的理解是,如果所有视图都只是
AnyView类型(而不是通过不透明some View实现的确切类型),SwiftUI 不会知道哪个视图树分支不需要被重新计算。但是如果你需要一个类似路由器的功能,需要使用完全不同的视图层次结构,我认为你不可避免地需要使用AnyView