Добавление через код событие кнопки с аргументом

223
09 января 2018, 11:42

Хочу массиву кнопкам, из 10 кнопок передать в событие OnClick метод Appropriation(i), с аргументом i, который будет увеличиваться. Суть: кнопка 1 имеет OnClick с Appropriation(1), кнопка 9 имеет OnClick с Appropriation(9). У меня выводится последняя итерация (9) на все кнопки, как сделать так что бы прибавлялись цифры

void Awake()
    {
        foreach (GameObject btn in  buttons)
          {
            for (int i = 0; i < 9; i++)
                btn.GetComponent<Button> ().onClick.AddListener(() => Appropriation(i) );
          }
    }
Answer 1

Я не понял зачем тут два цикла. Хотя даже с одним был бы тот же результат. Т.к. lambda выполнялась бы уже тогда, когда текущее значение i было бы конечным (уже было бы 9). Поэтому надо "захватить" копию этого значения. Это можно сделать объявив новую переменную в цикле

for (int i = 0; i < buttons.Length; i++) {
    int index = i;
    buttons[i].GetComponent<Button> ().onClick.AddListener(() => Appropriation(index));    
} 

В Javascript тоже часто возникает подобная проблема при навешивании слушателя:

Повесить обработчики событий в цикле

Javascript forEach добавляет повторные вызовы на каждый элемент по размеру цикла

READ ALSO
В чём разница между Convert.ToString, ToString и (String)?

В чём разница между Convert.ToString, ToString и (String)?

Например есть некая переменная:

304
Необработанное исключение System.Reflection.TargetInvocationException и BackgroundWorker

Необработанное исключение System.Reflection.TargetInvocationException и BackgroundWorker

Изучаю BackgroundWorker, решил попробовать на своей программе (при проверке обновлений), добавив BackgroundWorkerВроде сделал всё примерно как на msdn, но программа...

293
С# Есть ли действительно удобный способ парсинга html?

С# Есть ли действительно удобный способ парсинга html?

Почему все способы парсинга html на с# такие сложные и запарные? Очень долго программировал на ahk, и там можно в одну строку запарсить classname просто...

332
Не доверять File.Exists() и использовать try/catch?

Не доверять File.Exists() и использовать try/catch?

На одной из страниц форума https://stackoverflowcom/a/6186400/2948684, где идет обсуждение if/else vs

263