将不同的按钮单击事件动态分配给具有参数的同一函数



我遇到了这个问题,并试图解决它将近一个小时。我分享这些只是为了防止任何人面临同样的问题。为了更清楚地解释问题和答案,这里有一个例子:

1( 假设您动态创建一些按钮对象,并将它们添加到列表中:

private void CreateButtons(int length)
{
for (int i = 0; i < length; i++)
{
var newButton = Instantiate(buttonPrefab);
buttonList.Add(newButton);
}
}

2( 然后您想将相同的功能分配给不同的按钮,但具有不同的参数:

以下是指定的方法:

private void Test(int a)
{
print(a);
}

这是分配循环:

private void AssignClickEvents()
{
for (int i = 0; i < buttonList.Count; i++)
{
buttonList[i].GetComponent<Button>().onClick.AddListener(() => { Test(i); });
}
}

上面代码的问题是,当点击一个按钮时,它不会给你0,1,2…等等。所有按钮都会给你相同的值,这是循环参数"i"的最后一个赋值。检查解决方案的答案:

我不知道这背后的确切原因,但为了让事情顺利进行,你需要使用一个局部变量作为函数参数。这是代码:

private void AssignClickEvents()
{
for (int i = 0; i < buttonList.Count; i++)
{
int a = i;
buttonList[i].GetComponent<Button>().onClick.AddListener(() => { Test(a); });
}
}

我希望它能有所帮助!

最新更新