nig*_*ird 12 ios scenekit swift
我试图从我的场景中删除表示路径的节点集.它们是SCNSphere几何节点和表示线的自定义几何的组合,使用SCNGeometrySource和SCNGeometryElement创建.
我没有在任何类型的数组中保留这些节点.相反,我按照名称搜索场景中rootNode的节点树的第一级,以及后续调用使它们淡出的动作序列,并且它们应该从根节点中删除它们自己.
代码如下:
func clearPath() {
    //
    let disappear = SCNAction.fadeOut(duration: 0.1)
    let remove = SCNAction.removeFromParentNode()
    let sequence = SCNAction.sequence([disappear, remove])
    if let pathNodesToRemove = pathNodes() {
        //
        for node in pathNodesToRemove {
            //
            node.removeAllActions()
            node.runAction(sequence)
        }
    }
    if let lineNodesToRemove = lineNodes() {
        for node in lineNodesToRemove {
            //
            node.removeAllActions()
            node.runAction(sequence)
        }
    }
    path.removeAll()
}
哪里:
func pathNodes() -> [SCNNode]? {
    //
...        
    let nodes = rootNode.childNodes.filter { (node) -> Bool in
        //
        guard let name = node.name else { return false }
        if name.hasPrefix(configurationComponent.id) &&
            name.range(of:"_PATH") != nil {
            return true
        } else {
            return false
        }
    }
    return nodes
}
lineNodes()函数基本相同.
我打开Zombie Objects来追踪错误来自哪里,我总是得到同样的错误:对SceneKit`C3DNodeRemoveFromParentNode的引用作为线程上调用的最后一件事,以及EXC_BAD_ACCESS(代码= 1,地址...... ).
clearPath()函数是我称之为'RemoveFromParentNode'的整个应用程序中唯一的位置.
节点上没有物理实体,也没有保留在其他任何地方.
有关如何解决这个问题的任何想法?
编辑28/4/18:
这是发生它的线程的崩溃报告.似乎removeObjectFromChildNodesAtIndex被调用两次......
    Thread 9 name:  Dispatch queue: com.apple.scenekit.renderingQueue.Air_Relay.ARTCSCNView0x104126720
Thread 9 Crashed:
0   SceneKit                        0x00000001957d668c C3DNodeRemoveFromParentNode + 40
1   SceneKit                        0x0000000195826e28 -[SCNNode __removeObjectFromChildNodesAtIndex:] + 184
2   SceneKit                        0x0000000195826e28 -[SCNNode __removeObjectFromChildNodesAtIndex:] + 184
3   SceneKit                        0x0000000195827350 -[SCNNode removeFromParentNode] + 396
4   SceneKit                        0x000000019593e9fc -[SCNActionRemove updateWithTarget:forTime:] + 92
5   SceneKit                        0x0000000195907cb8 SCNCActionSequence::cpp_updateWithTargetForTime+ 2202808 (SCNNode*, double) + 316
6   SceneKit                        0x00000001957bcfb0 SCNActionApply + 112
7   SceneKit                        0x0000000195853d2c _applyActions + 236
8   CoreFoundation                  0x00000001814dccbc __CFDictionaryApplyFunction_block_invoke + 24
9   CoreFoundation                  0x00000001814c3f98 CFBasicHashApply + 132
10  CoreFoundation                  0x00000001814cdb64 CFDictionaryApplyFunction + 288
11  SceneKit                        0x0000000195853b5c C3DAnimationManagerApplyActions + 92
12  SceneKit                        0x000000019583b054 -[SCNRenderer _update:] + 656
13  SceneKit                        0x000000019583d018 -[SCNRenderer _drawSceneWithNewRenderer:] + 252
14  SceneKit                        0x000000019583d69c -[SCNRenderer _drawScene:] + 84
15  SceneKit                        0x000000019583daa0 -[SCNRenderer _drawAtTime:] + 728
16  SceneKit                        0x00000001958e446c -[SCNView _drawAtTime:] + 512
编辑30/04/18
我继续在应用程序中添加其他功能,我需要使用SCNAction.removeFromParentNode()删除节点.我也将这些问题隔离开来,使问题独立于上述代码.
在生成每个新节点时,会在SCNRendererDelegate更新中更频繁地调用它们.
我还尝试使用SCNAction.run块直接在节点上使用removeFromParentNode(),并出现同样的问题.
当您使用 SCNAction.removeFromParentNode() 时,您不会删除该节点,您必须删除它本身的节点。如果删除路径或操作,您实际上会生成一个 nil 值,因此当调用路径或操作时,现在会出现一个 nil 值,并且会崩溃。
| 归档时间: | 
 | 
| 查看次数: | 611 次 | 
| 最近记录: |