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 in foreach

只需在每次迭代中分配给一个新的局部变量,并将该局部变量用于 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