iOS应用中如何从SwiftUI视图返回至UIKit视图控制器?
解决方案
有两种简单的方式可以实现SwiftUI视图点击返回按钮后回到原UIKit控制器并显示完整视图:
方式一:使用环境变量@Environment(\.dismiss)(SwiftUI 3.0+)
这种方式最简洁,无需额外传递回调:
- 修改你的
ChooseProfileView,添加环境变量并在返回按钮中调用dismiss:
struct ChooseProfileView: View { @Environment(\.dismiss) private var dismiss var body: some View { VStack { // 返回按钮 Button("返回") { dismiss() } // 你的其他视图内容 Text("SwiftUI 视图内容") } } }
- 原UIKit控制器的代码无需修改,保持你现有的逻辑即可:
let chooseProfileView = ChooseProfileView() let hostingController = UIHostingController(rootView: chooseProfileView) hostingController.modalPresentationStyle = .fullScreen self.present(hostingController, animated: true, completion: nil)
方式二:使用回调闭包
如果需要兼容更早的SwiftUI版本,可以用闭包回调的方式:
- 给
ChooseProfileView添加一个回调闭包:
struct ChooseProfileView: View { // 定义回调闭包,用于通知UIKit控制器关闭页面 var onDismiss: (() -> Void)? var body: some View { VStack { Button("返回") { onDismiss?() } // 你的其他视图内容 Text("SwiftUI 视图内容") } } }
- 在UIKit控制器中创建视图时,传入闭包并实现dismiss逻辑:
let chooseProfileView = ChooseProfileView { [weak self] in // 弱引用self避免循环引用 self?.dismiss(animated: true) } let hostingController = UIHostingController(rootView: chooseProfileView) hostingController.modalPresentationStyle = .fullScreen self.present(hostingController, animated: true, completion: nil)
原理说明
因为你是用fullScreen的模态方式present SwiftUI的Hosting控制器,所以调用dismiss(animated:)会关闭当前的模态控制器,原UIKit控制器会自动完整显示出来。两种方式都是让SwiftUI视图触发UIKit的dismiss操作,因为SwiftUI本身无法直接操作外部的UIKit控制器实例。
内容的提问来源于stack exchange,提问作者Srinivasan_iOS
相关产品推荐
相关产品推荐

