前言

SwiftUI是Apple推出的声明式UI框架,但在某些场景下我们仍需要使用UIKit组件。本文将介绍如何在SwiftUI中集成和使用UIKit视图。

使用UIViewRepresentable

通过UIViewRepresentable协议可以将UIKit视图包装为SwiftUI视图:

1
2
3
4
5
6
7
8
9
struct MyTextView: UIViewRepresentable {
func makeUIView(context: Context) -> UITextView {
UITextView()
}

func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = "Hello from UIKit"
}
}

使用UIViewControllerRepresentable

对于视图控制器,可以使用UIViewControllerRepresentable

1
2
3
4
5
6
7
8
9
10
11
struct MyViewController: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
let vc = UIViewController()
vc.view.backgroundColor = .systemBlue
return vc
}

func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
// 更新逻辑
}
}

双向数据绑定

通过Coordinator实现SwiftUI和UIKit之间的数据绑定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct MySlider: UIViewRepresentable {
@Binding var value: Double

func makeCoordinator() -> Coordinator {
Coordinator(self)
}

class Coordinator: NSObject {
var parent: MySlider

init(_ parent: MySlider) {
self.parent = parent
}

@objc func valueChanged(_ sender: UISlider) {
parent.value = Double(sender.value)
}
}

func makeUIView(context: Context) -> UISlider {
let slider = UISlider()
slider.addTarget(context.coordinator,
action: #selector(Coordinator.valueChanged(_:)),
for: .valueChanged)
return slider
}

func updateUIView(_ uiView: UISlider, context: Context) {
uiView.value = Float(value)
}
}

总结

SwiftUI和UIKit可以很好地协同工作,通过UIViewRepresentableUIViewControllerRepresentable协议,我们可以在SwiftUI中无缝使用现有的UIKit组件。