我的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;