从 SwiftUI 视图转到 UIViewController

Zba*_*itZ 11 ios swiftui

我正在努力将一些 SwiftUI 内容实施到我现有的应用程序中。我目前有一个 UIViewController,它承载一个用于相机预览的 MTKView。

我创建了一个新的 SwiftUI 视图,它现在是我的视图,如我的SceneDelegate.swift文件中所设置。SwiftUI 视图按预期在启动时加载。现在,我想创建一个 segue,当用户点击我列表中的一行时,它将全屏显示到我现有的 UIViewController。这是我如何称呼它的;

var body: some View {
    VStack {
        NavigationView {
            List(sessionTypes) { session in
                NavigationLink(destination: CameraControllerWrapper()) {
                    SessionRow(session: session)
                    .frame(height: 40.0)
                }
            }
        .navigationBarTitle(Text("Camera Types"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于后代,这是我的CameraControllerWrapperUIViewControllerRepresentable;

struct CameraControllerWrapper: UIViewControllerRepresentable {
typealias UIViewControllerType = CameraController

   func makeUIViewController(context: UIViewControllerRepresentableContext<CameraControllerWrapper>) -> CameraControllerWrapper.UIViewControllerType {
    return CameraController()
   }

   func updateUIViewController(_ uiViewController: CameraControllerWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<CameraControllerWrapper>) {
    //
   }
}
Run Code Online (Sandbox Code Playgroud)

虽然这“有效”,但一旦调用 CameraController,我的应用程序就会崩溃,因为似乎找不到我的任何 IBOutlets。CameraController 是一个内置在故事板中的 UIViewController。

Zba*_*itZ 9

我设法解决了这个问题,意识到我需要从 Storyboard 实例化 UIViewController,而不是在代码中(因为我在 Storyboard 中构建了它的布局,以及一些编程元素)。要使用上面的NavigationLink,我需要调整我的UIViewControllerRepresentable

struct CameraControllerWrapper: UIViewControllerRepresentable {
    typealias UIViewControllerType = CameraController

    func makeUIViewController(context: UIViewControllerRepresentableContext<CameraControllerWrapper>) -> CameraControllerWrapper.UIViewControllerType {

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let mainViewController: CameraController = mainStoryboard.instantiateViewController(withIdentifier: "CameraController") as! CameraController
      return mainViewController

    }

    func updateUIViewController(_ uiViewController: CameraControllerWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<CameraControllerWrapper>) {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)