我的Creator版本是v2.2.2
Toggle是继承Button组件的,所以问题从Button里面找,一顿操作过后发现是Button里的_sprite属性为null,而_sprite是在下面这个函数设置的
_applyTarget () {
let target = this._getTarget();
this._sprite = this._getTargetSprite(target);
if (!this._originalScale) {
this._originalScale = cc.Vec2.ZERO;
}
this._originalScale.x = target.scaleX;
this._originalScale.y = target.scaleY;
this._registerTargetEvent(target);
},
那这个函数会在哪里执行呢?
/**
* !#en
* Transition target.
* When Button state changed:
* If Transition type is Button.Transition.NONE, Button will do nothing
* If Transition type is Button.Transition.COLOR, Button will change target's color
* If Transition type is Button.Transition.SPRITE, Button will change target Sprite's sprite
* !#zh
* 需要过渡的目标。
* 当前按钮状态改变规则:
* -如果 Transition type 选择 Button.Transition.NONE,按钮不做任何过渡。
* -如果 Transition type 选择 Button.Transition.COLOR,按钮会对目标颜色进行颜色之间的过渡。
* -如果 Transition type 选择 Button.Transition.Sprite,按钮会对目标 Sprite 进行 Sprite 之间的过渡。
* @property {Node} target
*/
target: {
default: null,
type: cc.Node,
tooltip: CC_DEV && "i18n:COMPONENT.button.target",
notify (oldValue) {
this._applyTarget();
if (oldValue && this.target !== oldValue) {
this._unregisterTargetEvent(oldValue);
}
}
},
__preload () {
this._applyTarget();
this._resetState();
},
那按理来说,这个函数是肯定会被执行的,又一顿操作发现,我设置interactable的时候居然在_applyTarget之前就执行了更新spriteframe的函数。
所以要怎么解决呢?其实很简单也很sb,看下面
//tabItem是包含cc.Toggle组件的一个节点
let node = cc.instantiate(tabItem);
node.parent = toggleContainer.node; // 先将node添加到某个节点上,就会先执行__preload
node.getComponent(cc.Toggle).interactable = data.enabled;
如果是下面的写法,就会出现spriteframe没有更新的问题
//tabItem是包含cc.Toggle组件的一个节点
let node = cc.instantiate(tabItem);
node.getComponent(cc.Toggle).interactable = data.enabled; // 先更新了spriteframe,但是_sprite为空,所以更新了个寂寞
node.parent = toggleContainer.node;