問題:在 for 循環內添加監聽,當事件觸發時,i 總是最後一個。
用Unity做了一個單選框,有十幾個toggle,放在一個toggleGroup下面,用GetComponentsInChildren方法獲取。
toggles = toggleGroup.GetComponentsInChildren<Toggle>();
按如下代碼循環添加監聽,發現方法觸發時傳入的參數不對,總是數組最後一個,而不是對應的toggle。
for (int i = 0; i < toggles.Length; i++)
{
toggles[i].onValueChanged.AddListener(delegate { onValueChanged(toggles[i]); });
}
問題原因:方法觸發時 i 值始終爲 toggles 的長度,這和閉包有關
解決方法:不直接使用 i,在循環內聲明一個toggle引用作爲參數傳遞,代碼修改如下:
for (int i = 0; i < toggles.Length; i++)
{
Toggle toggle = toggles[i];
toggle.onValueChanged.AddListener(delegate { onValueChanged(toggle); });
}