AddListener in foreach
本文关键字:foreach in AddListener | 更新日期: 2023-09-27 17:57:12
突然 foreach 语句中的 lambda 出现问题:
IEnumerator RefreshNextFrame( Part Current )
{
yield return null;
if( Current.Nodes == null )
yield break;
Current.Nodes.ForEach( n => Debug.Log( n.name ) );//outputs node0, node1
for( int i = 0; i < Current.Nodes.Count; i++ )
{
Node node = Current.Nodes[i];
Button button = Instantiate( Resources.Load<GameObject>( "Prefabs/Button" ) ).GetComponent<Button>();
button.transform.SetParent( content );
button.GetComponentInChildren<Text>().text = node.name;
button.onClick.AddListener( delegate
{
Debug.Log( button.GetComponentInChildren<Text>().text );
} );
}
}
单击按钮始终输出node1
只需在每次迭代中分配给一个新的局部变量,并将该局部变量用于 AddListener。
编辑快速示例:
MyFunction 将始终接收 100 作为 i 的值:
for (int i=0; i<100; i++) {
button.onClick.AddListener(() => MyFunction(i));
}
但是如果你这样做,它将正常工作:
for (int i=0; i<100; i++) {
int iLocal = i;
button.onClick.AddListener(() => MyFunction(iLocal));
}
由于这段代码,一切都在 couroutine 中。这是答案 http://answers.unity3d.com/answers/974195/view.html