在 UIViewControllerRepresentable 中处理 @IBOutlet

我正在尝试将 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!
speedisk 回答:在 UIViewControllerRepresentable 中处理 @IBOutlet

它绝对可以工作,但您必须从故事板实例化您的 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!
}
本文链接:https://www.f2er.com/785.html

大家都在问