在写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存下来,在销毁的时候,需要释放掉。