SwiftUI 与 UIKit 共存仍是许多项目的实际需求。本章讲解如何集成现有 UIKit 控件,双向通信机制,以及在 UIKit App 中引入 SwiftUI 视图。
一. 集成现有 UIKit 控件
SwiftUI 提供协议 UIViewRepresentable 和 UIViewControllerRepresentable,可将 UIKit 视图或控制器封装为 SwiftUI 组件。
示例:将 UISlider 集成到 SwiftUI
import SwiftUI
import UIKit
struct SliderView: UIViewRepresentable {
@Binding var value: Float
func makeUIView(context: Context) -> UISlider {
let slider = UISlider(frame: .zero)
slider.minimumValue = 0
slider.maximumValue = 100
slider.addTarget(context.coordinator, action: #selector(Coordinator.valueChanged(_:)), for: .valueChanged)
return slider
}
func updateUIView(_ uiView: UISlider, context: Context) {
uiView.value = value
}
func makeCoordinator() -> Coordinator {
Coordinator(value: $value)
}
class Coordinator: NSObject {
var value: Binding<Float>
init(value: Binding<Float>) {
self.value = value
}
@objc func valueChanged(_ sender: UISlider) {
value.wrappedValue = sender.value
}
}
}
二. 双向通信原理
- 通过
@Binding把 SwiftUI 状态绑定传入 UIKit 控件。 - UIKit 控件事件回调触发
Coordinator内方法,更新绑定状态。 - SwiftUI 监听绑定变化,刷新视图。
这种桥接方式保证了数据双向同步。
三. UIKit App 引入 SwiftUI View
在传统 UIKit 项目中,可以直接使用 UIHostingController 包装 SwiftUI 视图。
示例:
import UIKit
import SwiftUI
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let swiftUIView = Text("Hello from SwiftUI!")
.padding()
.font(.title)
let hostingController = UIHostingController(rootView: swiftUIView)
addChild(hostingController)
hostingController.view.frame = view.bounds
view.addSubview(hostingController.view)
hostingController.didMove(toParent: self)
}
}
你可以将任何 SwiftUI 视图嵌入 UIKit 界面,灵活混合使用两者优势。
四. 小结
-
UIViewRepresentable允许把 UIKit 视图封装成 SwiftUI 组件,便于复用现有代码。 - 通过
Coordinator和@Binding实现双向通信,保证状态同步。 - UIKit 项目中用
UIHostingController嵌入 SwiftUI 界面,实现渐进式迁移。 - 掌握协作方式,有助于平滑过渡及整合旧项目。














网友评论