从SwiftUI视图中选择到UIViewController

时间:2019-09-17 00:21:19

标签: ios swiftui

我正在努力在我现有的应用程序中实现一些SwiftUI内容。我目前有一个UIViewController,该UIViewController托管一个MTKView用于相机预览。

我已经创建了一个新的SwiftUI视图,该视图现在是我的{em> root 视图,如我的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"))
        }
    }
}

为后代,这是我的CameraControllerWrapper UIViewControllerRepresentable;

struct CameraControllerWrapper: UIViewControllerRepresentable {
typealias UIViewControllerType = CameraController

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

   func updateUIViewController(_ uiViewController: CameraControllerWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<CameraControllerWrapper>) {
    //
   }
}

尽管这“有效”,但调用CameraController时,我的应用程序立即崩溃,因为似乎找不到我的任何IBOutlets。 CameraController是故事板中内置的UIViewController。

1 个答案:

答案 0 :(得分:0)

我设法解决了这一问题,因为意识到我需要从情节提要而不是代码中实例化UIViewController(因为我已在情节提要中构建了它的布局以及一些编程元素)。要使用以上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>) {
        //
    }
}