复制
收藏
提问
全网
for (int i = 0; i < (uiParent.childCount)-1; i++) { int ButtonIndex = i; Buttons[i].onClick.AddListener(() => ShowIntroduction(ButtonIndex)); } }public void ShowIntroduction(int i) { EIText.text = EquipmentIntroduction[i]; print(i); }按下第一个按钮,为何print(i)的值会是3
4月前
回答简洁
更专业一些
在C#编程中,当您使用for
循环为多个按钮添加点击事件监听器时,如果直接在循环体内部使用变量i
,由于闭包的原因,所有的监听器最终都会引用循环结束后i
的最终值。在您提供的代码示例中,i
的值在循环结束时是(uiParent.childCount)-1
,因此所有按钮的点击事件都会调用ShowIntroduction((uiParent.childCount)-1)
,这就是为什么print(i)
的值会是3的原因。
要解决这个问题,您可以通过创建一个匿名方法或者使用Action
委托来捕获循环中i
的当前值。以下是两种可能的解决方案:
-
使用匿名方法捕获变量值:
for (int i = 0; i < (uiParent.childCount) - 1; i++) { Buttons[i].onClick.AddListener(delegate { ShowIntroduction(i); }); }
-
使用
Action
委托:Action<int> showIntroAction = null; for (int i = 0; i < (uiParent.childCount) - 1; i++) { showIntroAction = (index) => ShowIntroduction(index); Buttons[i].onClick.AddListener(showIntroAction); }