SwiftUI中是否有一种方法可以根据具有值的可选绑定返回不同的视图?

时间:2019-11-18 21:59:30

标签: swift swiftui combine

我试图在获取视图模型上的某些数据后显示视图(该数据可以是可选的,因为视图模型仅根据请求获取它)。

为什么以下各项不可能/我应该怎么做?

@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()

任何帮助将不胜感激。

2 个答案:

答案 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()
        }
    }
}