c#中为列表中的按钮,循环添加点击事件,引用都为最后一个按钮,bug原因及解决--unity学习笔记

在写demo的时候,制作了一个模型界面,左侧为滑动条,点击切换右侧模型显示。

在为左侧滑动条内的子物体添加点击事件的时候,遇到一个bug。在循环添加事件的时候,btn的引用都是最后一个按钮。

void Start()
{
    Button btn;
    foreach(Transform child in gameobj.transform)
    {
        btn = child.GetComponent<Button>();
        buttonList.Add(btn);

        btn.onClick.AddListener( ()=>
        {
            changeAnimModel(btn);
        });
    }
}

void changeAnimModel(Button btn)
{
    Debug.Log("点击按钮" + btn.name);
}

这代码,乍一看也没什么问题,但是测试点击按钮时,输出的都是最后一个按钮。

通过一番操作后,发现问题就出在定义的局部变量btn上,btn的引用在循环中一直被赋值,然后作为参数传给点击方法,点击方法中拿到的一直都是btn的引用,所以方法触发时,拿到的自然是最后一个按钮的引用。

简单改了下,将局部变量btn改为for循环中定义btn,再做测试。

 void Start()
 {
     //Button btn;
     foreach(Transform child in gameobj.transform)
     {
         var btn = child.GetComponent<Button>();
         buttonList.Add(btn);

         btn.onClick.AddListener( ()=>
         {
             changeAnimModel(btn);
         });
     }
 }

意料之中,这次输出正常了。

这些btn的引用也需要用一个list存下来,在销毁的时候,需要释放掉。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值