arrays - 如何自定义 SwiftUI ViewBuilder
问题描述
有一些关于 SwiftUI Builder 的帖子是这样的。这样我就可以嵌入我的内容,例如:
struct Container<Content>: View where Content: View {
var content: Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content()
}
var body: some View {
return content
}
}
struct ContentView: View {
var body: some View {
Container() {
Text("Content 1").tag(0)
Text("Content 2").tag(1)
}
}
}
我想知道我是否没有在 init 中传递 ViewBuilder。相反,我想做类似的事情:
struct ContentView: View {
var body: some View {
Container().buildContent {
Text("Content 1").tag(0)
Text("Content 2").tag(1)
}
}
}
我之所以要这样做是因为我想模仿TabView
's tabItem
。
解决方案
您不能让buildContent
函数改变Container
,但您可以默认使用Container
仅出售 an 的a ,并将其用作使用所需内容EmptyView
创建新内容的跳板。Container
你可以像这样实现那种 API:
struct Container<Content>: View where Content: View {
var content: Content
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body: some View {
return content
}
}
extension Container where Content == EmptyView {
init() {
self.content = EmptyView()
}
/// Return a new `Container` with the given `Content` builder.
func buildContent<V : View>(@ViewBuilder content: () -> V) -> Container<V> {
Container<V>(content: content)
}
}
struct ContentView: View {
var body: some View {
Container().buildContent {
Text("Content 1").tag(0)
Text("Content 2").tag(1)
}
}
}
推荐阅读
- wpf - How to prevent WPF Gridviewcolumn collapse fully
- python - Passing file and data to requests, error at every turn
- intellij-idea - 列出 IntelliJ 模块中的所有错误
- java - 使用流对内部对象的 Map 属性进行分组?
- spring - Spring-boot 不在 h2 中创建表 - JPA/Hibernate
- android - 如何确定 kotlin-multiplatform 项目中的构建类型
- python - 遍历字典并向熊猫数据框添加值
- r - 在 R 中,for 循环中的 GET 需要更快(httr)
- amcharts - Amcharts4 XYChart 删除容器和图表数据之间的空间
- angular - 带孩子的 Angular 2 路线