You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS应用中如何从SwiftUI视图返回至UIKit视图控制器?

解决方案

有两种简单的方式可以实现SwiftUI视图点击返回按钮后回到原UIKit控制器并显示完整视图:

方式一:使用环境变量@Environment(\.dismiss)(SwiftUI 3.0+)

这种方式最简洁,无需额外传递回调:

  1. 修改你的ChooseProfileView,添加环境变量并在返回按钮中调用dismiss:
struct ChooseProfileView: View {
    @Environment(\.dismiss) private var dismiss
    
    var body: some View {
        VStack {
            // 返回按钮
            Button("返回") {
                dismiss()
            }
            
            // 你的其他视图内容
            Text("SwiftUI 视图内容")
        }
    }
}
  1. 原UIKit控制器的代码无需修改,保持你现有的逻辑即可:
let chooseProfileView = ChooseProfileView()
let hostingController = UIHostingController(rootView: chooseProfileView)
hostingController.modalPresentationStyle = .fullScreen
self.present(hostingController, animated: true, completion: nil)

方式二:使用回调闭包

如果需要兼容更早的SwiftUI版本,可以用闭包回调的方式:

  1. 给ChooseProfileView添加一个回调闭包:
struct ChooseProfileView: View {
    // 定义回调闭包,用于通知UIKit控制器关闭页面
    var onDismiss: (() -> Void)?
    
    var body: some View {
        VStack {
            Button("返回") {
                onDismiss?()
            }
            
            // 你的其他视图内容
            Text("SwiftUI 视图内容")
        }
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:57:07