我正在尝试创建一个动态添加的Toggles列表,该列表一直有效,直到我尝试向切换添加一个侦听器。传递给SelectColor的值应该为每个切换增加1,但传递的值恰好是数组的长度。将索引始终放在每个切换的最后一个索引之上。
foreach (HexLand color in colors) {
Toggle option = Instantiate<Toggle> (ColorTogglePrefab);
option.transform.SetParent (EditorOptions.transform);
option.name = "Toggle " + color.Name;
option.group = toggleGroup;
if (i == 0) {
option.isOn = true;
} else {
option.isOn = false;
}
option.GetComponent<HexLandOption> ().label.text = color.Name;
option.onValueChanged.AddListener (delegate {
SelectColor (i); // current usage has array length 2. i always returns 2.
});
i++;
}
public void SelectColor(int index) {
Debug.Log(index); // Writes 2 to console.
activeColor = colors [index].Color;
}
我是否可以使用一种方法来确保每个切换正确返回其值?
答案 0 :(得分:0)
您正在从外部范围捕获i
。委托不会立即执行,所以在回调发生的那一刻,i
已经有了最后一个值,即数组的长度。
在循环内创建另一个变量来存储迭代的值。
请参阅How to tell a lambda function to capture a copy instead of a reference in C#?