我试图在获取视图模型上的某些数据后显示视图(该数据可以是可选的,因为视图模型仅根据请求获取它)。
为什么以下各项不可能/我应该怎么做?
@Binding var someViewModel: SomeViewModel?
var body: some View {
if let viewModel = self.someViewModel {
return filledView(with: viewModel)
}
return emptyView()
}
此处不起作用的部分是Swift UI视图构建器中的if let
。
一种解决方案是拥有一个单独的Bool,该Bool在加载数据时触发,或者甚至是一个枚举,用于识别何时插入数据以及何时插入数据,但是视图代码中充满了可选的值检查,这是不理想的
例如我想避免做类似的事情:
Image(systemName: someViewModel?.icon.symbol() ?? "plus_sign")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 60, height: 60)
.foregroundColor(Color.red)
.padding()
任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用地图。如果它具有某些值或将其完全忽略,它将解开可选的内容:
var body: some View {
Group {
someViewModel.map { FilledView(with: $0) }
}
}
答案 1 :(得分:0)
只是找到了另一个选择,我们可以将空白视图和填充视图函数的返回值都包装在AnyView
中,问题也就消失了。
空的示例将变为:
func emptyView() -> AnyView {
return AnyView(Text(""))
}
填充视图的示例变为:
func filledView(for viewModel: SomeViewModel) -> AnyView {
return AnyView(VStack(alignment: .leading) {
Image(systemName: viewModel.icon.symbol())
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 60, height: 60)
.foregroundColor(Color.red)
.padding()
}
}
}