我正在努力将一些 SwiftUI 内容实现到我现有的应用程序中。我目前有一个 UIViewController,它承载了一个用于相机预览的 MTKView。
我创建了一个新的 SwiftUI View ,它现在是我的 Root View ,在我的 SceneDelegate.swift
中设置文件。 SwiftUI View 按预期在启动时加载。现在,我想创建一个转场,当用户点击列表中的一行时,它将全屏转场到我现有的 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
UIViewController 可表示;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 是内置在 Storyboard中的 UIViewController。
最佳答案
我通过意识到我需要从 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>) {
//
}
}
关于ios - 从 SwiftUI View 转到 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57965840/