场景
与 UIKit
命令式创建视图的方式不同,SwiftUI 采用声明式的方式来描述应该在屏幕上显示的内容。
SwiftUI 视图的 body
属性描绘了该视图的视图树(view tree
)。body 的返回值是 some View
,这个类型并没有包含视图树的更多信息。这不利于我们分析问题。
1
2
3
4
5
6
7
8
9
10
struct Test: View {
var body: some View {
NavigationView {
Text("Hello, World!")
.font(.title)
.navigationBarTitle("Root View")
.background(Color.gray)
}
}
}
Tips
可以借助以下 extension
,检查 body 的实际类型。
1
2
3
4
5
6
extension View {
func debug() -> Self {
print(Mirror(reflecting: self).subjectType)
return self
}
}
以上面的例子为例
1
2
3
4
5
6
7
8
9
10
struct Test: View {
var body: some View {
NavigationView {
Text("Hello, World!")
.font(.title)
.navigationBarTitle("Root View")
.background(Color.gray)
}.debug()
}
}
debug 方法输出如下
1
2
3
4
5
6
7
8
NavigationView<
ModifiedContent<
ModifiedContent<
Text,TransactionalPreferenceTransformModifier<NavigationTitleKey>
>,
_BackgroundModifier<Color>
>
>
小结
利用 debug extension
可以方便地分析视图树的实际类型。这有助于帮助我们在出问题的时候分析视图树,另外,也有助于我们在学习的时候分析苹果自身的设计。