2017-02-23 49 views
0

Я пытаюсь создать список Toggles, добавленный динамически из списка, который работает до тех пор, пока я не попытаюсь добавить слушателя к переключателям. Значение, переданное SelectColor, должно увеличиваться на единицу для каждого переключения, но переданное значение - это точно длина массива. помещая индекс всегда 1 над последним индексом для каждого переключения.Динамически addListener to Toggle

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

Может быть, использовать для петли? – Programmer

+0

Это была моя первая попытка. он дал тот же результат. всегда возвращался 2. –

ответ

0

Вы захватываете i из внешнего пространства здесь. Делегат не выполнил бы сразу, поэтому в тот момент, когда происходит обратный вызов, i уже имеет последнее значение, которое является длиной вашего массива.

Создайте еще одну переменную внутри цикла, чтобы сохранить значение для итерации.

How to tell a lambda function to capture a copy instead of a reference in C#?

+0

Я не уверен, как правильно преобразовать это в форму, которая подходит для того, что мне нужно? Я не очень опытен, когда дело доходит до делегатов и как они должны работать –

+0

добавить переменную перед делегатом и использовать ее вместо 'i': ' var index = i; option.onValueChanged.AddListener (delegate { SelectColor (index); }); ' – Nerlog

+0

Значение теперь не выходит за пределы диапазона, но теперь оно возвращает только последнее значение, доступное в массиве. –