2016-07-15 53 views
1

突然問題在foreach語句拉姆達:的addListener中的foreach

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

+0

嘗試將** Current.Nodes.ForEach(n => Debug.Log(n.name)); **行放入lambda表達式中,以查看兩個節點是否仍有您期望的名稱。也許你會在代碼的其他地方覆蓋它們而不知道。 – GregaMohorko

+0

不是。名字,我期望。 –

+0

此代碼在couroutine中。這有意義嗎? –

回答

0

只需在每次迭代時分配一個新的局部變量並將該局部變量用於AddListener。

編輯 簡單的例子:

的MyFunction總會收到100,因爲我對這個值:

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)); 
} 
+0

我們已經討論過了,它不起作用,因爲他的代碼正在Unity的couroutine中執行,它本身已經是某種帶有已保存上下文的lambda表達式。在裏面創建一個lambda表達式不會保存上下文,這就是爲什麼它不起作用。 – GregaMohorko