toggle.isChecked = false;会触发点击事件附demo 怎么解决

我将toggle设置为可以反复选中,但有时需要代码设置为非选中状态
但这样会触发toggle的点击事件,下面写了个demo
麻烦开发看下,怎么设置状态可以不触发点击事件

toggle.rar (430.8 KB)

onLoad() {
this.current = 0;
},
radioButtonClicked: function (toggle) {
var index = this.radioButton.indexOf(toggle);
this.current = index;
cc.log(“我点击了”, index)
},
test: function () {
this.radioButton[this.current].isChecked = false;
}

creator是哪个版本?

V2.0.7
官网下的最新的啊

我下载个v2.0.8试试

V2.0.8也会触发
this.radioButton[this.current].isChecked = false; 触发点击事件

我不想设置状态时触发事件,有办法吗
v2.0.2还是这样的

需要定制一下引擎,把CCToggle中isChecked的setter方法中的

this._emitToggleEvents();

这一句去掉,放到check和uncheck方法中,这样你如果直接改变isChecked参数的话就不会触发事件,想要触发事件的话就需要通过check和uncheck方法

(1)我这也是升级到2.0.7版本后出现这样的问题;
(2)在2.0.3版本时,回调是在编辑器中绑定的,在onLoad()中读取缓存配置去设置toggle.isChecked,在toggle的回调中再次设置toggle.isChecked,这样没问题;
(3)升级到2.0.7版本,打开界面调用onLoad(),在设置toggle.isChecked时会调用其回调,回调中再次设置toggle.isChecked导致反复回调;
(4)把toggle的点击回调通过代码toggle.node.on(‘toggle’, this.callback, this)设置,从编辑器中移除其回调,发现又可以了;
(5)应该是新版在设置toggle.isChecked时触发了回调,不知道为啥这样修改

怎么定制引擎?我也出现了。

现在的时事件触发改成了 当toggle状态变化时触发,感觉这个改动是正常的,unity的toggle事件就是onValueChanged。
只不过这么突然改了,对旧项目有不少影响。

个人认为这样子改不对。
如果我有需求要Atoggle状态改变时更改Btoggle的状态。Btoggle的状态改变时,又更改Atoggle时,就会堆栈溢出。

1赞

我也觉得这么设计 toggle 有点不妥, 应该给一个修改状态不发送事件的接口, 我用 tableview 时, 在 cell 里设置状态, 当滑动 tableview 时, 有些 cell 会被复用, 然后就会调用 cell 里的初始化方法, 然后点击时才会发送的事件就被发送出来了, 但是我只是滑动列表并没有改变选中状态

很难用,我也需要一个修改状态但是不发送事件的接口。!!!

想问下楼主,咋解决的?

:joy:刚开始用toggle的时候也是因为这个问题搞了个死循环

没有解决, 弃用toggle,改用按钮 代码控制状态显示

window.cc.Toggle.prototype._emitToggleEvents = function(isEmit) {
if (!cc.isValid(isEmit)) isEmit = false;
if (isEmit) {
this.node.emit(‘toggle’, this);
if (this.checkEvents) {
cc.Component.EventHandler.emitEvents(this.checkEvents, this);
}
}
cc.log(“window.cc.Toggle.prototype._emitToggleEvents:” + isEmit);
};
window.cc.Toggle.prototype.toggle = function() {
cc.log(“window.cc.Toggle.prototype.toggle:”);
this.isChecked = !this.isChecked;
this._emitToggleEvents(true);

};
window.cc.Toggle.prototype.check = function() {
cc.log(“window.cc.Toggle.prototype.check:”);
this.isChecked = true;
this._emitToggleEvents(true);

};
window.cc.Toggle.prototype.uncheck = function() {
cc.log(“window.cc.Toggle.prototype.uncheck”);
this.isChecked = false;
this._emitToggleEvents(true);

};

这样不会触发
toggle.isChecked=true;

这三个方法还是跟原来一样,会触发
toggle.toggle();
toggle.toggle();

我也弃用toggle了,引发的问题太多,直接把toggle组件一删,cc.Toaggle改为cc.Node,自己控制状态,世界清净了~引发的问题有~但凡改变了勾选状态就会触发点击的回调,无论isChecked还是check,uncheck,还有一个离谱的问题。不知道是引擎还是浏览器缓存问题还是怎样,log中明明看着----设置状态:true,可toggle就是没勾选。—设置状态:false,结果toggle勾选了。反正状态是反的,但是初始设置的时候又是对的~~一个小时这样被这玩意给消耗了~呜呜