我正在尝试将 Apple 的一个演示中的 ViewController 包装在 SwiftUI UIViewControllerRepresentable 中,它有一组 IBOutlets,它们连接到主故事板。我该如何处理这种情况?应该将 IBOutlets 替换为 View 结构,还是应该尝试将 Storyboard 与 SwiftUI 合并?
struct ARViewContainer: UIViewControllerRepresentable {
@ObservedObject var model: Model
typealias UIViewControllerType = ARView
func makeUIViewController(context: Context) -> ARView {
return ARView(model)
}
func updateUIViewController(_ uiViewController:
ARViewContainer.UIViewControllerType, context:
UIViewControllerRepresentableContext<ARViewContainer>) { }
}
class ARView: UIViewController, ARSCNViewDelegate {
@ObservedObject var model: Model
// MARK: IBOutlets
@IBOutlet var sceneView: VirtualObjectARView!
@IBOutlet weak var addObjectButton: UIButton!
@IBOutlet weak var blurView: UIVisualEffectView!
@IBOutlet weak var spinner: UIActivityIndicatorView!
@IBOutlet weak var upperControlsView: UIView!
答案 0 :(得分:0)
它绝对可以工作,但您必须从故事板实例化您的 UIViewController
。现在,您只是使用 ARView()
对其进行初始化,因此它与情节提要没有连接,也无法连接出口。
基本示例:
struct ContentView : View {
var body: some View {
MyStoryboardVCRepresented()
}
}
struct MyStoryboardVCRepresented : UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> MyStoryboardVC {
UIStoryboard(name: "MyStoryboard", bundle: Bundle.main).instantiateViewController(identifier: "MyVC") as! MyStoryboardVC //theoretically unsafe to unwrap like this with `!`, but we know it works, since the view controller is included in the storyboard
}
func updateUIViewController(_ uiViewController: MyStoryboardVC, context: Context) {
uiViewController.label.text = "Hello, world!"
}
}
class MyStoryboardVC : UIViewController {
@IBOutlet var label : UILabel!
}