NGUI例子里的popuplist是这样的:,但有时我们希望下拉选项都有删除功能,也就是这样:,一种方法是改popuplist的源码,我想这个实现起来不难,但现在我想说的是用反射来实现此功能,以及其他注意点。

第一步:我们查看下popuplist的源码可以发现,他有个OnCLick点击事件,而里面实现的就是绘制所有下拉选项的,并且所有下拉选项的的父节点都是mChild这个私有字段,
第二步:我们只要给popuplist再附加一个我们自己写的脚本A,在这个脚本里面通过反射mChild的孩子,就可以找到所有的下拉选项了,我们知道,一个对象如果给他附加多个脚本,并且每个脚本里面都有OnClick事件的话,那么所有脚本的OnCLick事件都会被执行的!但是,这有个特别需要注意的地方,就是他们执行的顺序,脚本在Inspector面板中越靠上就越先执行,所以我们为popuplist附加的脚本必须在UIPopup List之后,如果不在此之后的话,那么就会去先执行我们定义的脚本(这里我定义的脚本名称为Mypopuplist),可我们脚本里面是对mChild的反射,这时是反射不到结果的,因为UIPopup List里面的mChild还没实例化好,所以必然为空,所以popuplist对象的组件顺序必须是这样的,UIPopup List先去实例化好下拉选项,Mypopuplist再去反射下拉选项:
第三步:反射到所有的下拉选项之后,也就是UILbael对象,就为每一个UILabel对象添加删除Sprite即可,并为其添加点击事件,Mypopuplist中的OnClick事件代码如下(动态添加删除功能):
  void OnClick()
{
GameObject obj = GetChildren(popuplist, "mChild") as GameObject;
if (obj != null)
{
UILabel[] labels = obj.GetComponentsInChildren<UILabel>();
callBackData(labels);
}
}
//反射popuplist下拉选项中所有的孩子UILabel
object GetChildren(object obj, string name)
{
Type type = obj.GetType();
FieldInfo fieldinfo = type.GetField(name, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
return fieldinfo.GetValue(obj);
}
//动态为每一个选项添加删除sprite
void callBackData(UILabel[] labels)
{
float f = -0.038f;
foreach (UILabel label in labels)
{
f = f - 0.01f;
UISprite sprite = NGUITools.AddSprite(label.gameObject, atlas, "chahao");
sprite.depth = label.depth + ;
sprite.transform.localScale = new Vector3(0.25f, 0.25f, );
sprite.transform.Translate(0.42f, -0.03f, );
BoxCollider collider = sprite.gameObject.AddComponent<BoxCollider>();
collider.size = new Vector3(100f, 100f, );
UIEventListener listener = sprite.gameObject.AddComponent<UIEventListener>();
listener.onPress += (a, b) =>
{
UILabel current = a.GetComponentInParent<UILabel>();
DeleteItems(current.text);
};
}
}
//删除选项
public void DeleteItems(string username)
{
popuplist.items.Remove(username);
}

我想代码大家都能看懂,但我这里只说一点,这里我为什么给删除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是肯定能执行我们的删除功能的!

效果图如下:
以上是个人的总结,如有不当,希望大家多多批评指正!

NGUI-为Popuplist的下拉选项添加删除功能的更多相关文章

  1. JS为Select下拉框添加输入功能

    JavaScript使用parentNode.nextSibling.value实现的本功能,实际上你会发现网页上有两个控件元素,一个是Select,一个是input,使用CSS将input覆盖于se ...

  2. JavaScript---网络编程(11)--DHTML技术演示(4)-单选框/下拉菜单/添加文件

    本节讲述单选框/下拉菜单/添加文件,综合css,html和JavaScript. 单选框: 实现的功能是:(类似平时的性格测试) 先隐藏一部分页面,然后通过点击单选框来显示. 再通过选项的选择-(每个 ...

  3. 微信小程序之自定义select下拉选项框组件

    知识点:组件,animation,获取当前点击元素的索引与内容 微信小程序中没有select下拉选项框,所以只有自定义.自定义的话,可以选择模板的方式,也可以选择组件的方式来创建. 这次我选择了组件, ...

  4. WeChat-SmallProgram:自定义select下拉选项框组件

    1):创建组件所需的文件 2):自定义组件 CSS 及 JS 组件的wxml: <view class='com-selectBox'> <view class='com-sCont ...

  5. JS Div滚动,下拉框添加属性,年月日下拉条

    创建某一下拉菜单的项: str = str+"<option value='"+i+"'>"+i+"</option>&quo ...

  6. [js开源组件开发]模拟下拉选项框select

    模拟下拉选项框select 在css3流行的情况下,下拉框还是无法满足PD的需求,所以有了autosearch,有了模拟下拉框.效果如下图: select DEMO请案例点击这里查看.http://w ...

  7. Jquery ajax 绑定multiselect多选下拉选项,同时异步执行返回值

    Jquery ajax 绑定multiselect多选下拉选项,同时异步执行获取返回值 function load(mslt_employees,belongto,mark) {//传入$(#ID) ...

  8. Excel设置下拉选项的方法

    前些日子参加提高班组织的数据采集工作,到各个二级学院搜集数据,当然离不开我们常用的Excel表格了.在这次采集数据的过程过程中还真学到了一两招.就比如在Excel中设置下拉选项的方法. 例如我们要在A ...

  9. 类似智能购票的demo--进入页面后默认焦点在第一个输入框,输入内容、回车、right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个。

    要实现的效果:进入页面后默认焦点在第一个输入框,输入内容.回车.right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个. PS:自己模拟的 ...

随机推荐

  1. ZOJ - 2112 Dynamic Rankings(BIT套主席树)

    纠结了好久的一道题,以前是用线段树套平衡树二分做的,感觉时间复杂度和分块差不多了... 终于用BIT套函数式线段树了过了,120ms就是快,此题主要是卡内存. 假设离散后有ns个不同的值,递归层数是l ...

  2. POJ-3067 Japan---树状数组逆序对变形

    题目链接: https://vjudge.net/problem/POJ-3067 题目大意: 日本岛东海岸与西海岸分别有N和M个城市,现在修高速公路连接东西海岸的城市,求交点个数. 解题思路: 记每 ...

  3. iOS逆向命令集

    越狱命令行 破壳: 10.10.215.119 ssh root@10.10.215.119 ssh root@10.10.213.176 CCBMobileBank Fuqianlade-iPhon ...

  4. React的安装

    创建: 2019/05/01 完成: 2019/05/01 create-react-app  学习及创建单页app npx create-react-app my-app cd my-app npm ...

  5. 2017.10.6 Java命名规范及使用情况

    Package 的命名 Package 的名字应该都是由一个小写单词组成. Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成 Class 变量的命名 变量的名字必须用 ...

  6. memcache 基本操作

    输入 telnet  localhost 11211 步骤: 1.输入 set hans 0 0 3 回车 2. 输入 123  回车 3. get  hans 回车 删除操作,输入 delete h ...

  7. ZIGBEE report机制分析

    ZIGBEE提供了report机制(现在只学习了send, receive还没学习) 主要目的是实现attribute属性的report功能,即提供了一种服务端和客户端数据同步的机制 以EMBER的H ...

  8. 给大家一个我的QQ群

    很少关注博客了,提供一个QQ群讨论 我的一个QQ群:158351344

  9. 使用工具Android Studio实现一个简单的Android版的新闻APP

    目的: 这是我学完Android课程后所写的一个小的.简单版的新闻APP 技术概要: 用到了SQLite数据库,用它来存储每篇新闻下的评论 新闻的来源是新浪新闻,我通过使用Fiddler来对新浪新闻A ...

  10. centos 7 ifconfig 命令找不到

    最近在配置linux 环境: 在官网看到centOS除了最新版本7,那就尝试一下吧.最小安装centOS 7之后发现没有ifconfig命令,在网上找了一下都说是路径的路问题. 我用echo $PAT ...