如何在SwiftUI中通过ViewBuilder访问TupleView?
我正在尝试访问我的TupleView,我的ViewBuilder使用它来构建内容,然后我正在尝试计数,在这里我编写了代码,直到现在,我需要帮助找到我的TupleView的计数,现在由于未知的原因,它返回0,这是我期望的5!谢谢你的帮助如何在SwiftUI中通过ViewBuilder访问TupleView?,swiftui,Swiftui,我正在尝试访问我的TupleView,我的ViewBuilder使用它来构建内容,然后我正在尝试计数,在这里我编写了代码,直到现在,我需要帮助找到我的TupleView的计数,现在由于未知的原因,它返回0,这是我期望的5!谢谢你的帮助 import SwiftUI struct ContentView: View { var body: some View { ModelView(content: { Text("Hello, w
import SwiftUI
struct ContentView: View {
var body: some View {
ModelView(content: {
Text("Hello, world! 1")
.padding()
Text("Hello, world! 2")
.padding()
Text("Hello, world! 3")
.padding()
Text("Hello, world! 4")
.padding()
Text("Hello, world! 5")
.padding()
})
}
}
struct ModelView<Content: View>: View {
var content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
let size = Mirror(reflecting: content).children.count // <<: Here! it returns 0! which must be 5!
print(size)
}
var body: some View {
content()
}
}
导入快捷界面
结构ContentView:View{
var body:一些观点{
ModelView(内容:{
文本(“你好,世界!1”)
.padding()
文本(“你好,世界!2”)
.padding()
文本(“你好,世界!3”)
.padding()
文本(“你好,世界!4”)
.padding()
文本(“你好,世界!5”)
.padding()
})
}
}
结构模型视图:视图{
变量内容:()->内容
初始化(@ViewBuilder内容:@escaping()->content){
self.content=内容
让size=Mirror(reflecting:content).children.count/首先,通过访问Mirror(reflecting:content)
您反映的是创建内容的闭包(您可以看到内容
实际上是()->内容
类型的闭包)
您可能想反映视图本身。为此,您需要反映特定实例:
let mirror = Mirror(reflecting: content()) // add the parentheses
然后,您尝试访问子项
。如果您使用上面的镜像访问它,您将获得(为清晰起见,键入格式化):
您将得到以下结果:
(
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(
content: SwiftUI.Text(
storage: SwiftUI.Text.Storage.anyTextStorage(
SwiftUI.unknown context at $7fff57642368.LocalizedTextStorage
), modifiers: []
),
modifier: SwiftUI._PaddingLayout(
edges: SwiftUI.Edge.Set(rawValue: 15),
insets: nil
)
),
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(...)
)
(
SwiftUI.ModifiedContent(
内容:SwiftUI.Text(
存储:SwiftUI.Text.storage.anyTextStorage(
SwiftUI.unknown上下文位于$7fff57642368.LocalizedTextStorage
),修饰语:[]
),
修改器:SwiftUI.\u填充布局(
边缘:SwiftUI.Edge.Set(原始值:15),
插图:无
)
),
SwiftUI.ModifiedContent(…)
)
这是类型为的元组:
(
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>
)
(
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent
)
这可能是你在这里通过反思所能得到的全部
重要提示
发件人:
游戏场和调试器使用镜像
你可能不应该在真正的应用程序中使用它。首先,通过访问镜像(反射:内容)
你正在反射创建内容的闭包(你可以看到内容
实际上是()->内容
类型的闭包)
您可能想反映视图本身。为此,您需要反映特定实例:
let mirror = Mirror(reflecting: content()) // add the parentheses
然后,您尝试访问子项
。如果您使用上面的镜像访问它,您将获得(为清晰起见,键入格式化):
您将得到以下结果:
(
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(
content: SwiftUI.Text(
storage: SwiftUI.Text.Storage.anyTextStorage(
SwiftUI.unknown context at $7fff57642368.LocalizedTextStorage
), modifiers: []
),
modifier: SwiftUI._PaddingLayout(
edges: SwiftUI.Edge.Set(rawValue: 15),
insets: nil
)
),
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(...)
)
(
SwiftUI.ModifiedContent(
内容:SwiftUI.Text(
存储:SwiftUI.Text.storage.anyTextStorage(
SwiftUI.unknown上下文位于$7fff57642368.LocalizedTextStorage
),修饰语:[]
),
修改器:SwiftUI.\u填充布局(
边缘:SwiftUI.Edge.Set(原始值:15),
插图:无
)
),
SwiftUI.ModifiedContent(…)
)
这是类型为的元组:
(
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>
)
(
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent
)
这可能是你在这里通过反思所能得到的全部
重要提示
发件人:
游戏场和调试器使用镜像
你不应该在真正的应用程序中使用它
如何在SwiftUI中通过ViewBuilder访问TupleView
与SwiftUI的方式完全相同。让我们看看ViewBuilder的buildBlock
是什么:
这意味着ViewBuilder
对于从1到10的每一个内容视图计数都有明确的功能
extension ViewBuilder {
public static func buildBlock<C0, C1, C2, C3>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> TupleView<(C0, C1, C2, C3)> where C0 : View, C1 : View, C2 : View, C3 : View
}
扩展视图生成器{
公共静态func构建块(c0:c0,c1:c1,c2:c2,c3:c3)->TupleView,其中c0:View,c1:View,c2:View,c3:View
}
因此,如果您想访问视图生成器元组视图,则需要执行相同的操作,如(使用Xcode 12.4测试)
struct ModelContentView:View{
var body:一些观点{
ModelView(内容:{
文本(“你好,世界!1”)
.padding()
文本(“你好,世界!2”)
.padding()
//文本(“你好,世界!3”)
//.padding()
//文本(“你好,世界!4”)
//.padding()
//文本(“你好,世界!5”)
//.padding()
})
}
}
结构模型视图:视图{
变量计数:Int
变量内容:()->内容
私有初始化(计数:Int=1,@ViewBuilder内容:@escaping()->content){
self.content=内容
self.count=计数
}
var body:一些观点{
内容()
}
}
扩展模型视图{
init(@ViewBuilder content:@escaping()->content),其中content==TupleView{
self.init(计数:2,内容:content)
}
init(@ViewBuilder content:@escaping()->content),其中content==TupleView{
self.init(计数:3,内容:content)
}
//…所有其他变体
}
如何在SwiftUI中通过ViewBuilder访问TupleView
与SwiftUI的方式完全相同。让我们看看ViewBuilder的buildBlock
是什么:
这意味着ViewBuilder
对于从1到10的每一个内容视图计数都有明确的功能
extension ViewBuilder {
public static func buildBlock<C0, C1, C2, C3>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> TupleView<(C0, C1, C2, C3)> where C0 : View, C1 : View, C2 : View, C3 : View
}
扩展视图生成器{
公共静态func构建块(c0:c0,c1:c1,c2:c2,c3:c3)->TupleView,其中c0:View,c1:View,c2:View,c3:View
}
因此,如果您想访问视图生成器元组视图,则需要执行相同的操作,如(使用Xcode测试)