NGUI List<EventDelegate> 小坑

NGUI 3.0 之后 采用了 一种 全新的 事件系统 List<EventDelegate> ,使用起来并不麻烦。

但是最近做项目碰到一个小问题,特此分享一下。

PS NGUI3.6.4版本

PS 有空还是看看 源码,有些 时候 光理解 还是没用的。

一、问题出现在UI 逻辑一块,在一个 UITween 调用之后 要回调一个 事件。

代码如下:

 1 public class MyTest2 : MonoBehaviour
 2 {
 3     public UITweener tween;
 4
 5
 6     List<EventDelegate> list;
 7     public virtual void Start () {
 8         list = tween.onFinished;
 9
10         EventDelegate.Add(tween.onFinished, Test);
11     }
12
13     List<string> list1 = new List<string>();
14     void Test()
15     {
16         Debug.Log(list == tween.onFinished);
17
18         EventDelegate.Remove(tween.onFinished, Test);
19
20         Debug.Log(" Test ");
21     }
22
23     void OnGUI()
24     {
25         if (GUI.Button(new Rect(10, 10, 150, 100), "I am a button"))
26             tween.PlayForward();
27         if (GUI.Button(new Rect(10, 110, 150, 100), "I am a button2"))
28             tween.PlayReverse();
29     }
30
31
32 }

但是之前 我是 以为  EventDelegate.Remove 这样就能够把 Onfinished 委托给去除的。

结果我发现不是如此,之后 这个 Tween 每次 调用 结束 之后, Test() 都会执行。

二、源码分析

看了下源码。发现问题出在这里:

这段代码就是 tween 结束后 调用的。

来观察一下 EventDelegate 的 流程

我们可以看到 他 使用了 onFinished 的 list , add 了 一个 包含了 test() Callback  的 EventDelegate

接下里 执行结束的的时候 使用了 同样的 list ,编辑得到 刚才那个  包含了 test() Callback  的 EventDelegate ,然后执行其中的 test()

同样的 Remove 操作也是如此。

但是 我们可以看到 tween 结束后 onFinished 已经 变过了。

所以这样一来 , EventDelegate.Remove 使用的 list 不再是 原来那个list,

也就意味着 tween 结束后 会永远调用 test() ,因为我们没有用 原来的 list 来 Remove  包含了 test() Callback  的 EventDelegate .

三、解决方法

但是我感觉 治标 不 治本,如果 我 想 调用 好几次 再 Remove 呢 ? 以后有空 在弄吧。

 1 public class MyTest2 : MonoBehaviour
 2 {
 3     public UITweener tween;
 4
 5
 6     List<EventDelegate> list;
 7     public virtual void Start () {
 8         list = tween.onFinished;
 9
10         //EventDelegate.Add(tween.onFinished, Test);
11         EventDelegate.Add(tween.onFinished, Test, true);
12     }
13
14     List<string> list1 = new List<string>();
15     void Test()
16     {
17         Debug.Log(list == tween.onFinished);
18
19         //EventDelegate.Remove(tween.onFinished, Test);
20
21         Debug.Log(" Test ");
22     }
23
24     void OnGUI()
25     {
26         if (GUI.Button(new Rect(10, 10, 150, 100), "PlayForward"))
27         {
28             Debug.Log(" PlayForward");
29             tween.PlayForward();
30         }
31
32         if (GUI.Button(new Rect(10, 110, 150, 100), "PlayReverse"))
33         {
34             Debug.Log(" PlayReverse ");
35             tween.PlayReverse();
36         }
37
38     }
39 }

上结果:

时间: 2024-10-22 20:11:11

NGUI List<EventDelegate> 小坑的相关文章

支付宝集成的小坑--集成支付宝集成总结(1)

现在很多公司的APP都会有支付环节,特别是现在的O2O项目,我参与过的近两个项目都有集成支付宝对两次集成做一下总结: 第一次集成支付宝,由于我们的做后台的大牛写了十几年代码,而且以前是银行项目的总监,整个支付流程基本上一切听大牛的,我按照做就行.基本上按照支付宝的流程走,支付环节没怎么出问题,总体来说支付流程比较perfect. 第一次集成的小坑: 1)无非就是支付宝里面使用了一些框架如SBJson 等常用的开源框架,而我们项目中也会用到SBJson类似的框架,估计会出现冲突 冲突的解决办法:A

一个关于Windows下SetCursorPos和GetCursorPos的小坑

这两天在做一个编辑特定格式Mesh的小工具,需要检查鼠标的移动,一般来说可以用WM_MOUSEMOVE事件解决的,但是我为了省事用了定时查询+设置的方式,也就是: 1 void Frame(void) 2 { 3 //do something else... 4 5 POINT cursorPos; 6 GetCursorPos(&cursorPos); 7 curMoveX = cursorPos.x - cursorBaseX; 8 curMoveY = cursorPos.y - curs

C#中的Infinity有个小坑

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的一个小坑. 我们知道,在C#中主要有如下几种数值类型:int.long.decimal.float和double.对于前三种,如果除零,那么会提示表达式错误(直接书写数字)或报DivideByZeroException异常(使用变量):对于后面两种,除零会得到正负无穷大,除非你是0.0/0.0那么会得到NaN

bottle的几个小坑

距离我在<web.py应用工具库:webpyext>里说要换用bottle,已经过去快两个月了--事实上在那之前我已经開始着手在换了.眼下那个用于 Backbone.js 介绍的样例程序已经完毕更换,其他一些原来基于web.py的应用也在逐步重写中.期间各种小坑不断,还好至今还没有碰到什么大坑--只是目測应该也不会有大坑. unicode 作为非英文应用的开发人员,unicode是一个绕只是去的坑. web.py 对此是不作处理的,全都按原编码方式处理. bottle 则作了一个有点奇怪的处理

CI load-&gt;view();的一个小坑。。。

CI load->view()  很智能,如果加载多个视图  他会全部读完再按顺序载入所有视图 但这里有一个小坑,底层会遍历你的函数,看有多少视图 再决定当前的视图是否为最后一个, 如果你的代码中有die exit这个的语句, 这个遍历就会被近中止, 所有的视图就都不会执行 切记 切记.. 如果想要中断这种机制,  直接执行视图,不执行下面的语句, : 加上$this->output->_display();就好了 但是这样就会失去灵活性. 谨慎用.

light oj 1066Gathering Food (bfs 稍微有点小坑)

1066 - Gathering Food Winter is approaching! The weather is getting colder and days are becoming shorter. The animals take different measures to adjust themselves during this season. - Some of them "migrate." This means they travel to other plac

MySQL MHA在线手动切换——小坑

今天测试了MySQL的高可用架构--MHA,并进行了自动切换.手动failover以及手动在线切换,其中手动在线切换发现小坑:当旧master切换为新slave后,没有自动将read_only设置为on,例证如下: 环境说明: OS:CentOS release 6.5 MySQL: 5.6.22-71.0-log Percona Server slave1:172.16.52.130 mysql> show variables like 'read_only'; +--------------

mciSendString 的两个小坑

刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 .mp3 作为闹铃,和这个有关系吗? 查看源代码. strSend = "PLAY " & STRING_SOUND_ALIAS & " REPEAT" Call mciSendString(strSend, rbuf, 0, 0) 为了将我从睡梦中闹醒(

【Swift】iOS开发小坑历险记(二)

前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 1.用动画更新约束没有动画效果? 缺少 layoutIfNeeded ,事例: UIView.animateWithDuration(0.15, animations: { () -> Void in self.heightConst