TypeError: undefined is not an object (evaluating ‘nextSibling._sgNode’)
报错如上
在web下没有问题,在模拟器下,每次都会有一到两个报错。
是在有layout约束节点下使用出现的
setcardIndex(card, v){
this.handCardbox.addChild(card)
let p = this._cardSort(v)
try {
card.setSiblingIndex(p)
}catch (e) {
console.log('排位错误:'+e)
}
// card.setLocalZOrder(p)
// card.zIndex = this._cardSort(cardList[i])
},
_cardSort(v){
for(let i in this.usrCards){
if(parseInt(v)<=parseInt(this.usrCards[i])){
this.usrCards.splice(i,0,v)
return i
}
}
this.usrCards.push(v)
return this.usrCards.length
},
找到原因
‘’’
/**
* !#en Set the sibling index of this node.
* !#zh 设置节点同级索引。
* @method setSiblingIndex
* @param {Number} index
* @example
* node.setSiblingIndex(1);
*/
_setSiblingIndex (index) {
if (!this.node._parent) {
return;
}
var Deactivating = 1 << 8;
if (this.node._parent._objFlags & Deactivating) {
cc.errorID(3821);
return;
}
var siblings = this.node._parent._children;
index = index !== -1 ? index : siblings.length - 1;
var oldIndex = siblings.indexOf(this.node);
if (index !== oldIndex) {
siblings.splice(oldIndex, 1);
if (index < siblings.length) {
siblings.splice(index, 0, this.node);
}
else {
siblings.push(this.node);
}
this._onSiblingIndexChanged && this._onSiblingIndexChanged(index);
}
},
_onSiblingIndexChanged (index) {
// update rendering scene graph, sort them by arrivalOrder
var parent = this.node._parent;
var siblings = parent._children;
var i = 0, len = siblings.length, sibling;
if (CC_JSB) {
if (cc.runtime) {
for (; i < len; i++) {
sibling = siblings[i]._sgNode;
// Reset zorder to update their arrival order
var zOrder = sibling.getLocalZOrder();
sibling.setLocalZOrder(zOrder + 1);
sibling.setLocalZOrder(zOrder);
}
}
else {
console.log(parent._sgNode)
parent._sgNode.removeChild(this._sgNode, false);
if (index + 1 < siblings.length) {
var nextSibling = siblings[index + 1];
parent._sgNode.insertChildBefore(this._sgNode, nextSibling._sgNode);
}
else {
parent._sgNode.addChild(this._sgNode);
}
}
}
else {//无jsb环境
for (; i < len; i++) {
sibling = siblings[i]._sgNode;
sibling._arrivalOrder = i;
cc.eventManager._setDirtyForNode(sibling);
}
cc.renderer.childrenOrderDirty = true;
parent._sgNode._reorderChildDirty = true;
parent._delaySort();
}
}
‘’’
cc.runtime 在模拟器里是判断不到的
而
‘’’
for (; i < len; i++) {
sibling = siblings[i]._sgNode;
// Reset zorder to update their arrival order
var zOrder = sibling.getLocalZOrder();
sibling.setLocalZOrder(zOrder + 1);
sibling.setLocalZOrder(zOrder);
}
}
‘’’
这段代码是有效的,照情况修改就可以了。