将 SwiftUI 视图返回到 UIKit ViewController

5

在通过HostingViewController展示的SwiftUI View中按下"保存按钮"后,我希望能够返回到我的UIKit View Controller页面。
这是如何从我的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)

这是我的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()
        }
    }
}

这是我的ProfileViewModel类,它在运行一些业务逻辑之后使用Combine发布shouldDismissView变量。
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视图中调用self.presentationMode.wrappedValue.dismiss()无法关闭我的SwiftUI视图,也不能让我返回到最初呈现它的UIKit视图控制器。希望能得到任何帮助。提前感谢。

1个回答

7
我看到几个问题:
  1. 你试图解除你的,但实际上,在你展示它之前,它被包装在一个中。

  2. 根据我刚刚进行的基本测试,即使没有导航控制器呈现你的,仍然不会在其上工作-- 我怀疑它只有在SwiftUI -> SwiftUI传递时才能准确传递,并且不能信任通过进行通信

我建议向传递一个闭包,该闭包可以从原始呈现视图控制器运行代码。这是一个简化的例子:


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")
        }
    }
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接