在按下我的UIKit视图(通过SwiftUI视图显示)上的保存按钮后,希望返回到我现在的SwiftUI视图控制器。
这是如何从我的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类,它在运行一些业务逻辑之后使用logic发布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() {
//....
}
}出于某种原因,在我的self.presentationMode.wrappedValue.dismiss()视图中调用的SwiftUI并不是否定了我的SwiftUI视图,也不允许我回到最初的UIKit视图控制器,后者首先给出了它。任何帮助都将不胜感激。提前感谢
发布于 2021-02-08 03:36:28
我看到了几个问题:
suiProfileView,但实际上,在你呈现它之前,它被包裹在一个UINavigationController里。--根据我刚才所做的一个基本测试,即使您的UIHostingController没有导航控制器,presentationMode仍然不能工作--我怀疑只有在使用SwiftUI时才能准确地通过->SwiftUI,并且不能信任它可以通过SwiftUI进行通信。
我建议将一个闭包传递给suiProfileView,该闭包可以从原始的呈现视图控制器运行dismiss代码。下面是一个简化的示例:
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")
}
}
}https://stackoverflow.com/questions/66095395
复制相似问题