首页 > 代码库 > 为Popuplist的下拉选项添加删除功能(NGUI)
为Popuplist的下拉选项添加删除功能(NGUI)
NGUI例子里的popuplist是这样的:,但有时我们希望下拉选项都有删除功能,也就是这样:,一种方法是改popuplist的源码,我想这个实现起来不难,但现在我想说的是用反射来实现此功能,以及其他注意点。
1 void OnClick() 2 { 3 GameObject obj = GetChildren(popuplist, "mChild") as GameObject; 4 if (obj != null) 5 { 6 UILabel[] labels = obj.GetComponentsInChildren<UILabel>(); 7 callBackData(labels); 8 } 9 }10 //反射popuplist下拉选项中所有的孩子UILabel11 object GetChildren(object obj, string name)12 {13 Type type = obj.GetType();14 FieldInfo fieldinfo = type.GetField(name, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);15 return fieldinfo.GetValue(obj);16 }17 //动态为每一个选项添加删除sprite18 void callBackData(UILabel[] labels)19 {20 float f = -0.038f;21 foreach (UILabel label in labels)22 {23 f = f - 0.01f;24 UISprite sprite = NGUITools.AddSprite(label.gameObject, atlas, "chahao");25 sprite.depth = label.depth + 1;26 sprite.transform.localScale = new Vector3(0.25f, 0.25f, 0);27 sprite.transform.Translate(0.42f, -0.03f, 0);28 BoxCollider collider = sprite.gameObject.AddComponent<BoxCollider>();29 collider.size = new Vector3(100f, 100f, 0);30 UIEventListener listener = sprite.gameObject.AddComponent<UIEventListener>();31 listener.onPress += (a, b) =>32 {33 UILabel current = a.GetComponentInParent<UILabel>();34 DeleteItems(current.text);35 };36 }37 }38 //删除选项39 public void DeleteItems(string username)40 {41 popuplist.items.Remove(username);42 }
我想代码大家都能看懂,但我这里只说一点,这里我为什么给删除Sprite添加的是OnPress事件,而不是OnClick事件呢?因为OnClick事件是永远也不会被执行的,原因是这样的:我的NGUI版本是3.6.7,在UICamera脚本中的ProcessTouch方法里面,在判断是否要执行OnClick事件的判断语句:if (currentTouch.clickNotification != ClickNotification.None && currentTouch.pressed == currentTouch.current),而3.6.7之前或更早的版本里面的这句是这样写的:if (currentTouch.clickNotification != ClickNotification.None),第一个判断currentTouch.clickNotification != ClickNotification.None表示触摸事件是否在最后发出点击通知,只有当我们点击的对象是disabled的,或者拖动对象直到满足取消点击事件这个条件,ClickNotification枚举才为None,第二个判断是:点击的对象和当前鼠标碰到的对象是否是同一对象(因为有可能我们点击一个对象时,鼠标不释放,鼠标移动到另一个对象上去释放),如果我们此时用的NGUI版本里的UICamera,他里面对OnClick事件是否触发的判断只有这句:currentTouch.clickNotification != ClickNotification.None,那么这时我们用OnClick,是完全没有问题的!而如果用的是3.6.7版本的话,那么用OnClick是错误的,因为永远无法触发OnClick事件,因为当我们点击popuplist对象时,下拉选项被展现,此时我们再次点击(任何一个地方),下拉选项会被立即Destory销毁,也就是造成下拉选项被收缩的效果,这里也不得不说说OnClick事件和OnPress事件的作用了,OnClick事件是:当点击的对象和释放时的对象一致时,才触发OnClick事件,而这里下拉选项是被立即销毁的,所以当我们点击删除按钮并释放的时候,下拉选项在这之前就已经被销毁了,那么释放的对象和点击的对象就不一致了,也就自然而然形成不了OnClick 事件,而OnPress(obj,bool)事件,是当点击对象的时候就触发了,所以用OnPress是肯定能执行我们的删除功能的!
为Popuplist的下拉选项添加删除功能(NGUI)