Ios SwiftUI,在@Viewbuilder中将视图作为参数传递
我的好奇心驱使我将Ios SwiftUI,在@Viewbuilder中将视图作为参数传递,ios,struct,swiftui,swift-protocols,viewbuilder,Ios,Struct,Swiftui,Swift Protocols,Viewbuilder,我的好奇心驱使我将视图类型作为参数传递给@ViewBuilder。在@ViewBuilder中将模型/基元类型作为参数传递是完全有效的 如下代码所示 struct TestView<Content: View>: View { let content: (String) -> Content init(@ViewBuilder content: @escaping (String) -> Content) { self.
视图
类型作为参数传递给@ViewBuilder
。在@ViewBuilder
中将模型/基元类型作为参数传递是完全有效的
如下代码所示
struct TestView<Content: View>: View {
let content: (String) -> Content
init(@ViewBuilder content: @escaping (String) -> Content) {
self.content = content
}
var body: some View {
content("Some text")
}
}
struct ContentTestView: View {
var body: some View {
TestView {
Text("\($0)")
}
}
}
若我试图传递一个SwiftUI视图
类型,那个么编译器对它不满意
let content: (View) -> Content
即使@ViewBuilder
的参数接受自定义协议类型,如可搜索
,但不接受查看
协议
编译器告诉我此协议“视图”只能用作一般约束,因为它具有自身或关联的类型要求
我的全部想法是允许内容
保存节/列表/文本
编辑:我希望代码如下
struct TestView<Content: View>: View {
let content: (View) -> Content
init(@ViewBuilder content: @escaping (View) -> Content) {
self.content = content
}
var body: some View {
content(
List {
ForEach(0..<10) { i in
Text(\(i))
}
}
)
}
}
struct ContentTestView: View {
var body: some View {
TestView { viewbody -> _ in
Section(header: Text("Header goes here")) {
viewbody
}
}
}
}
struct TestView:View{
让内容:(查看)->内容
初始化(@ViewBuilder内容:@escaping(视图)->content){
self.content=内容
}
var body:一些观点{
内容(
名单{
ForEach(0..in
节(标题:文本(“标题在此处”)){
视图体
}
}
}
}
有什么办法可以做到这一点吗?可能的解决方案是使用
AnyView
,如
struct TestView<Content: View>: View {
let content: (AnyView) -> Content
init(@ViewBuilder content: @escaping (AnyView) -> Content) {
self.content = content
}
var body: some View {
content(AnyView(
Text("Demo") // << put here any view hierarchy
))
}
}
struct TestView:View{
让内容:(AnyView)->content
初始化(@ViewBuilder内容:@escaping(AnyView)->content){
self.content=内容
}
var body:一些观点{
内容(任意视图)(
Text(“Demo”)//非常有趣……在继续之前……您希望如何在TestView{???中使用它,因为???将是一个不透明的未知对象,对于您来说,view?@Asperi更新了预期的代码。感谢您的回答,它按预期工作。不建议使用AnyView
(在某些情况下允许).我在想更好的办法。
struct TestView<Content: View>: View {
let content: (AnyView) -> Content
init(@ViewBuilder content: @escaping (AnyView) -> Content) {
self.content = content
}
var body: some View {
content(AnyView(
Text("Demo") // << put here any view hierarchy
))
}
}