Swift 从主机控制器返回到故事板中的另一个控制器

Swift 从主机控制器返回到故事板中的另一个控制器,swift,swiftui,uikit,storyboard,Swift,Swiftui,Uikit,Storyboard,我有一个带有情节提要的项目,但现在我要迁移到SwiftUI 我有一个主机控制器来控制del SwiftUI段,但现在我需要从情节提要返回到另一个控制器 基本上我可以做到这一点:Storyboard(controller1)->HostingController(SwiftUI)。 现在我需要返回:HostingController(SwiftUI)->情节提要(controller2)我喜欢使用闭包。我想你是这样介绍主机控制器的吧 let viewController = UIHostingCo

我有一个带有
情节提要
的项目,但现在我要迁移到
SwiftUI

我有一个
主机控制器
来控制del SwiftUI段,但现在我需要从
情节提要
返回到另一个控制器

基本上我可以做到这一点:
Storyboard(controller1)
->
HostingController(SwiftUI)

现在我需要返回:
HostingController(SwiftUI)
->
情节提要(controller2)

我喜欢使用闭包。我想你是这样介绍主机控制器的吧

let viewController = UIHostingController(rootView: ContentView())
self.present(viewController, animated: true)
您可以在SwiftUI视图结构中添加闭包
dismisself

struct ContentView: View {
    var dismissSelf: (() -> Void)?
    
    var body: some View {
        Button(action: {
            dismissSelf?()
        }) {
            Text("Return")
        }
    }
}
按下按钮时,将调用
dismisself
。现在,您需要将
dismisself
分配给解除
UIHostingController
的代码块。您可以这样做:

class ViewController: UIViewController {    
    @objc func buttonPressed() {
        
        var viewController: UIViewController?
        
        let contentView = ContentView {
            /// set the closure (it's a trailing closure, so you don't need to put the `dismissSelf`)
            viewController?.dismiss(animated: true, completion: nil)
        }
        
        viewController = UIHostingController(rootView: contentView)
        
        if let vc = viewController {
            self.present(vc, animated: true, completion: nil)
        }
    }

    /// make the button
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = UIButton(frame: CGRect(x: 50, y: 50, width: 80, height: 40))
        button.setTitle("Present", for: .normal)
        button.setTitleColor(.blue, for: .normal)
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        
        view.addSubview(button)
    }
}
这件事有一点让人恶心
viewController
永远不会为零,但为了避免强制展开,我在let中加入了一个

结果:


很好,但我需要的是转到另一个与第一个不同的
ViewCotroller
。另请注意,我通过
IBSegueAction
@Playa调用了
主机控制器
,您可以显示
IBSegueAction
的代码吗?另外,您想要的导航流程是什么?是否要关闭显示的宿主控制器并将父视图替换为不同的视图控制器,或在宿主控制器的“顶部”显示该不同的视图控制器?