SwiftUI - 分析视图树的实际类型

场景

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 可以方便地分析视图树的实际类型。这有助于帮助我们在出问题的时候分析视图树,另外,也有助于我们在学习的时候分析苹果自身的设计


CatchZeng
Written by CatchZeng Follow
AI (Machine Learning) and DevOps enthusiast.