首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将SwiftUI视图解压缩回UIKit ViewController

将SwiftUI视图解压缩回UIKit ViewController
EN

Stack Overflow用户
提问于 2021-02-08 03:00:33
回答 1查看 820关注 0票数 2

在按下我的UIKit视图(通过SwiftUI视图显示)上的保存按钮后,希望返回到我现在的SwiftUI视图控制器。

这是如何从我的UIKit VC.导航到我的SwiftUI视图

代码语言:javascript
运行
复制
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视图,我想在按下保存按钮后将其关闭

代码语言:javascript
运行
复制
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变量.

代码语言:javascript
运行
复制
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视图控制器,后者首先给出了它。任何帮助都将不胜感激。提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-08 03:36:28

我看到了几个问题:

  1. --你想抛弃你的suiProfileView,但实际上,在你呈现它之前,它被包裹在一个UINavigationController里。--

根据我刚才所做的一个基本测试,即使您的UIHostingController没有导航控制器,presentationMode仍然不能工作--我怀疑只有在使用SwiftUI时才能准确地通过->SwiftUI,并且不能信任它可以通过SwiftUI进行通信。

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

代码语言:javascript
运行
复制
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")
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66095395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档