在循環內添加監聽,i總是最後一個

問題:在 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);  });
            }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章