UIViewRepresentable 协议

要在 SwiftUI 中使用 UIKit 视图,需要使用 UIViewRepresentable 协议包装该视图。只需要在 SwiftUI 中创建一个采用该协议的 struct ,即可管理 UIView 对象。

以下是 UIKit 视图的自定义包装器的骨架,该协议只需实现两个方法:

struct CustomView: UIViewRepresentable {

		// makeUIView 方法:负责创建和初始化视图对象
    func makeUIView(context: Context) -> some UIView {
        // Return the UIView object
    }

		// updateUIView 方法:负责更新 UIKit 视图的状态
    func updateUIView(_ uiView: some UIView, context: Context) {
        // Update the view
    }

}

在实际场景中,会用具体的 UIKit 视图替换 UIView。比如我们想要为 UITextView 创建自定义包装器,可以编写如下代码:

struct TextView: UIViewRepresentable {

		// 在 makeUIView 方法中,返回一个 UITextView 实例。这就是如何包装 UIKit 视图并使其可用于 SwiftUI 的方法
    func makeUIView(context: Context) -> UITextView {
        return UITextView()
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        // Update the view
    }
}

// 之后要在 SwiftUI 视图中使用 TextView ,就可以像对待任何普通视图一样,直接声明创建它
struct ContentView: View {
    var body: some View {
        TextView()
    }
}