【问题标题】:Edit variable in function then recall edited variable in another function在函数中编辑变量,然后在另一个函数中调用编辑的变量
【发布时间】:2019-12-24 08:37:24
【问题描述】:

我想先说我是 Swift 的初学者,但需要完成这个 ARKit 项目。

我使用该功能。

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
    let trackedNode = node
    if let imageAnchor = anchor as? ARImageAnchor{
       if (imageAnchor.isTracked) {
           trackedNode.isHidden = false
           offScreen = false
           print("Visible")
        }else {
           trackedNode.isHidden = true
           //print("\(trackedImageName)")
           offScreen = true
           print("No image in view")
       }
    }
 }

这会检测锚点是否在屏幕上并将全局变量 offScreen 设置为适当的值。

我想获取变量的新值并在我的createdVideoPlayerNodeFor 函数中使用它。如果 offScreen 为 true,则将 AVPlayer 设置为暂停。

但是,我在 createdVideoPlayerNodeFor 函数中声明了我的 AVPlayer,所以我不能将它包含在一个函数中。

我知道我一次指的是我的代码片段,所以我在下面发布了完整的代码。

var offScreen = false

    let videoNode = SCNNode()

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

        offScreen = false

        guard let imageAnchor = anchor as? ARImageAnchor else { return }

        let referenceImage = imageAnchor.referenceImage

        node.addChildNode(createdVideoPlayerNodeFor(referenceImage))

    }

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        let trackedNode = node

        if let imageAnchor = anchor as? ARImageAnchor{

        if (imageAnchor.isTracked) {
            trackedNode.isHidden = false
            offScreen = false
            print("Visible")

        }else {
            trackedNode.isHidden = true
            //print("\(trackedImageName)")
            offScreen = true
            print("No image in view")
        }
      }
    }

    func createdVideoPlayerNodeFor(_ target: ARReferenceImage) -> SCNNode {

        let videoPlayerGeometry = SCNPlane(width: target.physicalSize.width, height: target.physicalSize.height)
        var player = AVPlayer()

        if let targetName = target.name,
            let awsURL:NSURL = NSURL(string: "my video url :).mp4") {
            player = AVPlayer(url: awsURL as URL)
            player.play()

            NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil) { (notification) in
                        player.seek(to: CMTime.zero)
                        player.pause()
            }

    }


                         videoPlayerGeometry.firstMaterial?.diffuse.contents = player
                         videoNode.geometry = videoPlayerGeometry
                         videoNode.eulerAngles.x = -Float.pi / 2
                         return videoNode
    }

我急需这方面的帮助,所以如果有人能帮助我解决这个问题,我将不胜感激。

如果我解释得不够清楚或其他什么,请提出问题,我真的只需要弄清楚这一点:)

编辑:在我的测试中,我发现当变量在任一函数中更改时,几乎就像变量有 2 个不同的值,每个函数都有 1 个值。因此,如果在 didUpdate 函数中将其设置为 true,则无关紧要,因为 createdVideo 函数将使用在变量声明开头设置的值。这甚至可以在一个函数中设置变量的值并将其传递给另一个函数吗?

【问题讨论】:

    标签: ios swift xcode avplayer arkit


    【解决方案1】:

    offScreen 是一个实例变量,这意味着它在两个函数的范围内。您应该能够从任何一个读取和设置它。但是请注意,不要从 不同的线程 读取/写入该变量,因为该值可能无法预测。您可能想要设置一个offscreenQueue,一个私有的DispatchQueue,这将限制对该变量的访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多