在 iOS 开发中,SwiftUI 和 UIKit 是两种不同的用户界面框架。SwiftUI 是一款声明式框架,简洁易用;而 UIKit 是较为成熟的框架,功能丰富且灵活。因此,当需要使用 UIKit 独有的功能时,可以将其嵌入 SwiftUI 项目中。本章将带你了解如何在 SwiftUI 中使用 UIKit 视图,并介绍常见的集成场景和操作步骤。
SwiftUI 与 UIKit 集成可以通过 UIViewRepresentable 和 UIViewControllerRepresentable 协议实现,使得我们可以在 SwiftUI 项目中直接嵌入 UIKit 视图或视图控制器。
13.1 UIViewRepresentable 和 UIViewControllerRepresentable 的核心方法
- makeUIView(context:) 或 makeUIViewController(context:):负责初始化并返回 UIKit 视图或视图控制器。
- updateUIView(:context:) 或 updateUIViewController(:context:):用于更新视图内容,每当 SwiftUI 视图状态发生变化时,调用该方法以刷新显示。
13.2 使用 UIViewRepresentable 集成 UIKit 视图
下面示例展示了如何将 UIKit 的 UITextView 嵌入到 SwiftUI 中:
示例:嵌入 UITextView
import SwiftUI
import UIKit
// 创建一个自定义的 TextView 结构体,遵循 UIViewRepresentable 协议
struct TextView: UIViewRepresentable {
// 用于绑定 SwiftUI 的 @State 值,将文本内容传递给 UIKit 组件
@Binding var text: String
// 创建 UITextView 实例
func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
// 设置代理为 context.coordinator,以便监听输入事件
textView.delegate = context.coordinator
return textView
}
// 当 SwiftUI 中的 text 值变化时,更新 UITextView 显示的文本
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
}
// 创建并返回一个协调器 (Coordinator) 实例
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
// 定义 Coordinator 类,作为 UITextView 的代理,处理文本变化
class Coordinator: NSObject, UITextViewDelegate {
var parent: TextView
init(_ parent: TextView) {
self.parent = parent
}
// 当 UITextView 中的文本发生变化时,更新 SwiftUI 中绑定的 text 值
func textViewDidChange(_ textView: UITextView) {
parent.text = textView.text
}
}
}
- makeUIView 方法负责创建并返回一个 UITextView 实例。
- updateUIView 方法在 SwiftUI 状态更新时被调用,用于确保 UITextView 与 @Binding 的 text 同步。
- Coordinator 类实现了 UITextViewDelegate 协议,用于监听用户的文本输入,并将输入内容同步回 SwiftUI。