【问题标题】:Displaying an empty view in SwiftUI在 SwiftUI 中显示一个空视图
【发布时间】:2020-07-14 05:51:36
【问题描述】:

在 SwiftUI 中,经常需要根据某些条件显示“空”视图,例如:

struct OptionalText: View {
  let text: String?

  var body: some View {
    guard let text = text else { return }

    return Text(text) 
  }
}

不幸的是,这不会编译,因为guard 的主体必须返回一些视图,即当textnil 时的“空”视图。当textnil 时,应该如何重写这个示例,以便编译并呈现一个“空”视图?

【问题讨论】:

    标签: ios swift macos swiftui


    【解决方案1】:

    您可以使用@ViewBuilder。那么你甚至不需要EmptyView

    @ViewBuilder
    var body: some View {
        if let text = text {
            Text(text)
        }
    }
    

    请注意,您不会返回任何内容,@ViewBuilder 您只是构建您的视图。

    【讨论】:

    • 一个迂腐的注释,但你绝对是在“返回”一些东西,这个函数有一个 delcared 的返回类型。事实上你不必明确地return 某事实际上是github.com/apple/swift-evolution/blob/master/proposals/… 的结果。 SwiftUI DSL 和@ViewBuilder 使视图的构建成为一个单一的语句。
    • @Procrastin8 是的,我知道,我的意思是我们不直接返回任何东西,即。使用 return 关键字。但是对于未来的读者来说,您的解释可能会更清楚。
    • 我很想了解为什么这行得通。您有一个必须返回不透明类型的变量,但您只能在某些条件下返回它。 @ViewBuilder 是否会导致它默认返回 EmptyView
    • @ChristopherPickslay 您可以在这里找到最好的解释:What enables SwiftUI's DSL?
    【解决方案2】:

    从 Xcode 12 beta 2 开始,不再需要 Group 视图,并且支持 if let 声明,因此生成的 body 可以更加简洁:

    var body: some View {
        if let text = text {
            Text(text)
        } else {
            EmptyView()
        }
    }
    

    【讨论】:

    • 实际上现在您可以完全放弃else EmptyView 自动成为 else 条件,以防 if 失败。
    【解决方案3】:

    你必须返回一些东西。如果在某些情况下您不想显示任何内容,请“显示”an...EmptyView ;)

    var body: some View {
        Group {
            if text != nil {
                Text(text!)
            } else {
                EmptyView()
            }
        }
    }
    

    SwiftUI DSL 将要求您将 if/else 包装在 Group 中,并且 DSL 没有保护/if let 命名法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2020-01-23
      • 1970-01-01
      • 2020-06-21
      相关资源
      最近更新 更多