我有一个
ScrollView
,在 Grid Layout Group
对象上有一个 Content
组件 :
我的项目列表位于
Content
对象内,每个项目都拥有一个 Button
组件。
我正在尝试以编程方式添加
onClick
来处理大量对象并使用如下参数进行索引:
int i = 0;
foreach(Button btn in scrollViewContent.GetComponentsInChildren<Button>()) {
btn.onClick.AddListener(() => Load(i));
i++;
}
但是
onClick
我总是在所有项目点击时得到最后一个索引+1。这是我的日志:
直到日志 44,这是
foreach
打印循环,日志“index : 45”是单击的结果。
所以两个问题:
• 为什么所有项目点击返回相同的索引?
• 如何获得索引 45,而 i var 停在 44?
问题是回调都使用相同的变量。这可能看起来很奇怪,因为 int 是一种值类型并且必须被复制。但是,该变量是在本地范围内捕获的,导致在所有回调中使用相同的变量。
要解决此问题,请在 foreach 循环内创建一个新的局部变量。
var i = 0;
foreach (var button in buttons)
{
var index = i++;
button.onClick.AddListener(() => Load(index));
}