前言
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可以很好地协同工作,通过UIViewRepresentable
和UIViewControllerRepresentable
协议,我们可以在SwiftUI中无缝使用现有的UIKit组件。