Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将视图设置为在状态更改时不更新_Swift_Swiftui_Arkit - Fatal编程技术网

Swift 如何将视图设置为在状态更改时不更新

Swift 如何将视图设置为在状态更改时不更新,swift,swiftui,arkit,Swift,Swiftui,Arkit,我正在尝试集成一个ARKit视图,该视图使用机器学习处理帧,并在屏幕上显示结果。我已经让ARKit视图与UIViewRepresentable一起工作,并且在状态改变之前一切都正常。如何使AR视图保持静态,并且在状态更改时不更新。我只想更新显示结果的标签 这是我在状态更改时收到的错误:[CAMetalLayer nextDrawable]由于分配失败而返回nil。 这大概是因为arView在处理帧时不断被重新加载?不过不太确定 这是视图的代码: struct ARControlView: Vie

我正在尝试集成一个ARKit视图,该视图使用机器学习处理帧,并在屏幕上显示结果。我已经让ARKit视图与UIViewRepresentable一起工作,并且在状态改变之前一切都正常。如何使AR视图保持静态,并且在状态更改时不更新。我只想更新显示结果的标签

这是我在状态更改时收到的错误:
[CAMetalLayer nextDrawable]由于分配失败而返回nil。

这大概是因为arView在处理帧时不断被重新加载?不过不太确定

这是视图的代码:

struct ARControlView: View {
    @EnvironmentObject var resultHandler: ResultHandler
    var body: some View {
        let arView = ARViewContainer() // This is the UIViewRepresentable containing the ARKit view.
        return ZStack {
            arView
            VStack {
                Text(self.resultHandler.gesture.rawValue)
            }
            .onAppear {
                arView.restartARSession()
            }
            .onDisappear {
                arView.pauseArSession()
            }
        }
    }
}
这是针对ARViewContainer的:

struct ARViewContainer: UIViewRepresentable {

    var arView = ARView(frame: .zero)
    @EnvironmentObject var resultHandler: ResultHandler

    func makeUIView(context: Context) -> ARView {
        arView.session.delegate = context.coordinator
        arView.session.run(AROrientationTrackingConfiguration())
        return arView
    }

    func pauseArSession() {
        arView.session.pause()
    }

    func restartARSession() {
        arView.session.run(AROrientationTrackingConfiguration())
    }

    func updateUIView(_ uiView: ARView, context: Context) {}

    class Coordinator: NSObject, ARSessionDelegate {
        // Process frames here...
    }

    func makeCoordinator() -> ARViewContainer.Coordinator {
        Coordinator(self)
    }
}

每当
resultHandler
中的状态发生变化时,就会在
ARControlView
中重新评估
主体

这会导致由于以下原因而实例化新的
ARViewContainer
让arView=ARViewContainer()
位于
主体内
变量


如果将
let arView=ARViewContainer()
移动到
主体
变量之外,则不会在每次状态更改时重新启动
arView

我发现问题实际上并不像看上去那样。我收到的错误是由于帧被设置为.zero,出于某种原因,它返回nil。另外,将其设置为“不自动配置”,因为这也会产生奇怪的问题,导致图像被拉伸

这是我改变的路线:

发件人:

var arView = ARView(frame: .zero)
致:


谢谢其他人的帮助,我很感激

只需将导致状态更改的变量放在另一个环境对象中,您在ArViewContainer中不使用该对象。我尝试了多种方法将结果提供给ARControlView,但没有一种方法不出错。我甚至尝试过一些简单的方法,比如一个按钮,它可以改变一个test@State,而这个test@State只是一个基本字符串,错误就会发生。这就是为什么我得出结论,这是因为视图在使用相机或完成任务时正在重新渲染ArcContainerView。
var arView = ARView(frame: .init(x: 1, y: 1, width: 1, height: 1), cameraMode: .ar, automaticallyConfigureSession: false)