循环中动态添加监听的问题

隐身守侯 提交于 2020-01-27 03:07:16
for (int i = 0; i < list.Count - 1; i++)
{
    //第一段
    list[i].GetComponent<Button>().onClick.AddListener(
        () =>
        {
            OnClick(list[i + 1]);
        }
        );

    //第二段
    Button button = list[i + 1].GetComponent<Button>();
    list[i].GetComponent<Button>().onClick.AddListener(
        () =>
        {
            OnClick(button.gameObject);
        }
        );

}

两次碰到问题,都是下意识的写出了第一种写法,在点击触发回调时,引用到的对象都是数组的最后一个对象。原因是添加监听时,回调方法并不会立即执行,所以对应的i的值也不会立即传入,而i的所有值在内存中都是同一个地址,所以当点击触发时,i已经变成了list.count-2,所以引用的对象都是数组的最后一个对象了。

第二种写法则是传入了对应的对象,每个对象都有自己的地址,所以不会有上述问题。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!