如何在现有UIKit页面中直接嵌入添加SwiftUI视图组件
解决方案
方案1:Storyboard可视化实现(推荐,符合拖拽调整需求)
这个方案用Container View内嵌Hosting View Controller的方式实现,你可以直接在Storyboard里拖拽调整SwiftUI视图的位置和大小,和调整普通UIKit视图完全一致:
- 打开目标UIKit页面所在的Storyboard,从组件库拖入一个Container View到你指定的位置,直接添加约束固定宽高和布局即可。
- 删除Container View默认生成的关联子ViewController,再从组件库拖入一个Hosting View Controller到Storyboard画布中。
- 右键按住Container View,拉线到刚添加的Hosting View Controller,选择「embed」类型的segue完成关联。
- 新建自定义
UIHostingController子类,绑定你要展示的SwiftUI视图(示例如下,假设你的SwiftUI图表视图名为ChartView):
import SwiftUI import UIKit class ChartHostingController: UIHostingController<ChartView> { required init?(coder: NSCoder) { super.init(coder: coder, rootView: ChartView()) } }
- 回到Storyboard,选中刚添加的Hosting View Controller,在Identity检查器中将Custom Class设置为你刚创建的
ChartHostingController即可。
方案2:纯代码嵌入
如果你需要更灵活的动态控制,可以提前在Storyboard中拖入一个空白UIView作为SwiftUI视图的占位容器,再用代码嵌入:
- 首先在当前UIKit ViewController中声明Hosting Controller属性:
private let chartHostingController = UIHostingController(rootView: ChartView())
- 在
viewDidLoad方法中完成子控制器和视图的绑定:
override func viewDidLoad() { super.viewDidLoad() // 提前在Storyboard中创建好占位的chartContainerView并关联IBOutlet addChild(chartHostingController) chartHostingController.view.translatesAutoresizingMaskIntoConstraints = false chartContainerView.addSubview(chartHostingController.view) // 让SwiftUI视图撑满整个占位容器 NSLayoutConstraint.activate([ chartHostingController.view.topAnchor.constraint(equalTo: chartContainerView.topAnchor), chartHostingController.view.leadingAnchor.constraint(equalTo: chartContainerView.leadingAnchor), chartHostingController.view.trailingAnchor.constraint(equalTo: chartContainerView.trailingAnchor), chartHostingController.view.bottomAnchor.constraint(equalTo: chartContainerView.bottomAnchor) ]) chartHostingController.didMove(toParent: self) }
如果后续需要动态更新SwiftUI视图内容,直接修改chartHostingController.rootView即可。
内容的提问来源于stack exchange,提问作者Mehmet Ozen
相关产品推荐
相关产品推荐

