Ios 将SwiftUI视图返回到UIKit ViewController

Ios 将SwiftUI视图返回到UIKit ViewController,ios,swiftui,uikit,Ios,Swiftui,Uikit,在按下我的SwiftUI视图(通过HostingViewController显示)上的保存按钮后,希望返回到我的显示UIKit视图控制器。 这是从我的UIKit VC导航到我的SwiftUI视图的方式。 let profileView = suiProfileView().environmentObject(suiProfileViewModel()) let profileVC = UIHostingController(rootView: profileView)

在按下我的SwiftUI视图(通过HostingViewController显示)上的保存按钮后,希望返回到我的显示UIKit视图控制器。
这是从我的UIKit VC导航到我的SwiftUI视图的方式。

let profileView = suiProfileView().environmentObject(suiProfileViewModel())
            let profileVC = UIHostingController(rootView: profileView)
            let navVC = UINavigationController(rootViewController: profileVC)
            navVC.modalPresentationStyle = .fullScreen
            SideMenuManager.default.leftMenuNavigationController?.present(navVC, animated: true , completion: nil)
class suiProfileViewModel: suiProfileViewModelProtocol {

    //private var model: suiProfileFormProtocol
    @Published var profile = suiProfileForm()
    
    var viewDismissalModePublisher = PassthroughSubject<Bool, Never>()
    private var shouldDismissView = false {
        didSet {
            viewDismissalModePublisher.send(shouldDismissView)
        }
    }
    
    func businessLogicThatDeterminesIfShouldDismissView() {
        //....
    }
}
这是我的SwiftUI视图,我想在按下“保存”按钮后关闭该视图

import SwiftUI
import Combine

struct suiProfileView: View {
    @SwiftUI.Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @EnvironmentObject var profileViewModel: suiProfileViewModel
    
    @State var suiTitleText = t("general.save")
    
    var body: some View {
        GeometryReader { geo in
            VStack {
                personalInfoSection
                Spacer()
                Button("Save", action: profileViewModel.saveProfile)
                    .frame(width: geo.size.width * 0.8, height: geo.size.height * 0.08, alignment: .center)
            }
            .onReceive(profileViewModel.viewDismissalModePublisher) { shouldDismiss in
                if shouldDismiss {
                    self.presentationMode.wrappedValue.dismiss()
                }
            }
            .frame(width: geo.size.width, height: geo.size.height, alignment: .center)
            .padding()
        }
    }
}
导入快捷界面
进口联合收割机
结构配置文件视图:视图{
@环境(\.presentationMode)变量presentationMode:绑定
@EnvironmentObject变量profileViewModel:suiProfileViewModel
@State var suiteletext=t(“general.save”)
var body:一些观点{
GeometryReader{geo-in
VStack{
个人资讯组
垫片()
按钮(“保存”,操作:profileViewModel.saveProfile)
.框架(宽度:geo.size.width*0.8,高度:geo.size.height*0.08,对齐:。中心)
}
.onReceive(profileViewModel.ViewDismissalModelPublisher){shouldDismise in
如果该解雇{
self.presentationMode.wrappedValue.discouse()文件
}
}
.frame(宽度:geo.size.width,高度:geo.size.height,对齐:。中心)
.padding()
}
}
}
这是我的ProfileViewModel类,它在运行一些业务逻辑后使用Combine发布shouldDismissView变量。

let profileView = suiProfileView().environmentObject(suiProfileViewModel())
            let profileVC = UIHostingController(rootView: profileView)
            let navVC = UINavigationController(rootViewController: profileVC)
            navVC.modalPresentationStyle = .fullScreen
            SideMenuManager.default.leftMenuNavigationController?.present(navVC, animated: true , completion: nil)
class suiProfileViewModel: suiProfileViewModelProtocol {

    //private var model: suiProfileFormProtocol
    @Published var profile = suiProfileForm()
    
    var viewDismissalModePublisher = PassthroughSubject<Bool, Never>()
    private var shouldDismissView = false {
        didSet {
            viewDismissalModePublisher.send(shouldDismissView)
        }
    }
    
    func businessLogicThatDeterminesIfShouldDismissView() {
        //....
    }
}
class suiProfileViewModel:suiProfileViewModelProtocol{
//私有var模型:suiProfileFormProtocol
@已发布的var profile=suiProfileForm()
var viewDismissalModePublisher=PassthroughSubject()
私有变量shouldDismissView=false{
迪塞特{
viewDismissalModePublisher.send(shouldDismissView)
}
}
func businessLogicThatDeterminesIfShouldDismissView(){
//....
}
}

出于某种原因,在我的SwiftUI视图中调用的
self.presentationMode.wrappedValue.Disclose()
并没有取消我的SwiftUI视图,也不允许我返回到最初显示它的UIKit视图控制器。任何帮助都将不胜感激。提前感谢

我看到了几个问题:

  • 您试图关闭您的
    suiProfileView
    ,但实际上,在您展示它之前,它被包装在
    UINavigationController

  • 根据我刚才做的一个基本测试,即使您的
    suiProfileView
    在没有导航控制器的情况下显示,
    presentationMode
    仍然无法使用它——我怀疑它只有在使用SwiftUI->SwiftUI时才能准确传递,并且无法通过
    UIHostingController进行通信

  • 我建议将一个闭包传递给
    suiProfileView
    ,该闭包可以运行原始呈现视图控制器中的
    discouse
    代码。下面是一个简化的示例:

    
    import UIKit
    import SwiftUI
    
    class ViewController: UIViewController {
    
        var presentedController : UINavigationController?
        
        func dismissVC() {
            presentedController?.dismiss(animated: true)
        }
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                let swiftUIView = ContentView(dismiss: self.dismissVC)
                let hostVC = UIHostingController(rootView: swiftUIView)
                let navVC = UINavigationController(rootViewController: hostVC)
                navVC.modalPresentationStyle = .fullScreen
                self.present(navVC, animated: true , completion: nil)
                self.presentedController = navVC
            }
            
        }
    }
    
    
    struct ContentView : View {
        var dismiss : () -> Void
        
        @Environment(\.presentationMode) private var presentationMode: Binding<PresentationMode>
        
        var body: some View {
            Button(action: {
                dismiss()
                //presentationMode.wrappedValue.dismiss() <-- doesn't function
            }) {
                Text("Close")
            }
        }
    }
    
    
    
    导入UIKit
    导入快捷键
    类ViewController:UIViewController{
    var presentedController:UINavigationController?
    func dismissVC(){
    presentedController?退出(动画:true)
    }
    重写func viewDidLoad(){
    super.viewDidLoad()
    //加载视图后执行任何其他设置。
    DispatchQueue.main.asyncAfter(截止日期:.now()+1){
    让swiftUIView=ContentView(dismise:self.dismissVC)
    让hostVC=UIHostingController(rootView:swiftUIView)
    让navVC=UINavigationController(rootViewController:hostVC)
    navVC.modalPresentationStyle=.fullScreen
    self.present(navVC,动画:true,完成:nil)
    self.presentedController=navVC
    }
    }
    }
    结构ContentView:View{
    var DISCLISE:()->Void
    @环境(\.presentationMode)私有变量presentationMode:绑定
    var body:一些观点{
    按钮(操作:{
    解雇
    
    //presentationMode.wrappedValue.disclose()我很高兴探索它,因为我不一定会预测到关于
    presentationMode