在 SwiftUI 中显示空视图

Max*_*tov 15 macos ios swift swiftui

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

struct OptionalText: View {
  let text: String?

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

    return Text(text) 
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并不编译自体guard必须返回一些观点,那就是当一个“空”的观点textnil。如何把这个例子被重写,使其和编译时会生成一个“空”的看法textnil

Pro*_*in8 18

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

var body: some View {
    Group {
        if text != nil {
            Text(text!)
        } else {
            EmptyView()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


paw*_*222 11

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

@ViewBuilder
var body: some View {
    if let text = text {
        Text(text)
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此处您@ViewBuilder仅用于构建视图。如果您想了解更多有关幕后如何完成的信息,请参阅以下答案:

  • 一个迂腐的注释,但你绝对是在“返回”某些东西,该函数有一个明确的返回类型。事实上,您不必显式“返回”某些内容,这实际上是 https://github.com/apple/swift-evolution/blob/master/proposals/0255-omit-return.md 的结果。SwiftUI DSL 和“@ViewBuilder”使视图的构建成为一条语句。</迂腐> (3认同)

Max*_*tov 9

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

var body: some View {
    if let text = text {
        Text(text)
    } else {
        EmptyView()
    }
}
Run Code Online (Sandbox Code Playgroud)