SwiftUI中是否可以有一个可选的@ViewBuilder
闭包?例如,假设我想开发一个自定义视图,它采用两个视图构建器闭包,如下所示:
import SwiftUI
struct TopAndBottomView<Content>: View where Content: View {
let topContent: () -> Content
let bottomContent: () -> Content
init(@ViewBuilder topContent: @escaping () -> Content, @ViewBuilder bottomContent: @escaping () -> Content) {
self.topContent = topContent
self.bottomContent = bottomContent
}
var body: some View {
VStack {
topContent()
Spacer()
bottomContent()
}
}
}
struct TopAndBottomView_Previews: PreviewProvider {
static var previews: some View {
TopAndBottomView(topContent: {
Text("TOP")
}, bottomContent: {
Text("BOTTOM")
})
}
}
但我希望底部视图是可选的。我尝试了:
struct TopAndBottomView<Content>: View where Content: View {
let topContent: () -> Content
let bottomContent: (() -> Content)?
init(@ViewBuilder topContent: @escaping () -> Content, @ViewBuilder bottomContent: (() -> Content)? = nil) {
self.topContent = topContent
self.bottomContent = bottomContent
}
var body: some View {
VStack {
topContent()
Spacer()
if bottomContent != nil {
bottomContent!()
}
}
}
}
但是我得到了这个错误:
函数生成器属性“ViewBuilder”只能应用于函数类型的参数。
- 谢谢-谢谢
5条答案
按热度按时间6yoyoihd1#
考虑到
ViewBuilder
的buildIf
特性,以下方法可能允许将ViewBuilder
保留在init
中(这是首选)已通过测试并可与Xcode 11.2 / iOS 13.2兼容
所以和这个一样
还有这个
jecbmhm32#
@JoeBayLD问道:
如果topContent和bottomContent是不同的视图类型,您将如何执行此操作?我创建了一个新的泛型属性,但是当使用默认的'nil'参数时,任何调用者都无法推断内容类型
您可以将两个ViewBuilder参数都设为 * 非选择性 *,然后将副档名设为
where BottomContent == EmptyView
来行程“无底部内容”的情况:rbl8hiat3#
在 这个 来自 Sundell 的 奇妙 的 post 中 , 他 建议 我们 构建 一 个 自 定义 的
struct
Unwrap
来 展开 一 个 可选 值 并 将 其 转换 为View
, 下面 的 代码 是 他 在 那 篇 文章 中 所 做 的 :中 的 每 一 个
然后 , 我 编写 了 一些 代码 来 演示 如何 使用
Unwrap
来 构造 视图 :格式
结果 如下 :
或者 , 我们 可以 创建 一 个
View
扩展 来 完成 这项 工作 :格式
下面 是 有关 如何 使用 此 扩展 的 另 一 个 演示 :
格式
结果 为 :
py49o6xq4#
看起来您不需要在初始化器中使用@ViewBuilder,这样就可以正常工作:
qyyhg6bp5#
为@ViewBuilder视图设置默认值,以达到你所寻找的效果: