2015-03-17 3 views
0

У меня проблемы с использованием созданных во время запуска кнопок в Unity 5. Кнопки создаются правильно, но у меня есть некоторые проблемы с слушателями. Я использую этот код для создания кнопки:Unity 5 fix Listener calls

foreach (string str in _scene.PDF_ITEMS) 
    { 
     button = (GameObject)Instantiate(_primitive); 
     button.GetComponent<Button>().onClick.AddListener(() => OpenPDF(str)); 
     button.GetComponentInChildren<Text>().text = str; 
     button.GetComponent<Transform>().SetParent(this.transform, false); 
     GetComponent<RectTransform>().anchorMin = Vector2.zero; 
     GetComponent<RectTransform>().anchorMax = Vector2.one; 
     width++; 
    } 

И это функция OpenPDF:

private void OpenPDF(string name) 
{ 
    string comandType; 
    if (_scene.isCurrent(ArrayUtility.IndexOf<string>(_scene.PDF_ITEMS, name))) comandType = ControllerScene.IN_CLOSE_ITEM + ""; 
    else comandType = ControllerScene.IN_OPEN_ITEM + ""; 
    _inj.addComand(comandType, "" + (ArrayUtility.IndexOf<string>(_scene.PDF_ITEMS, name))); 
} 

Проблема заключается в том, что когда я играю сцену и нажмите на кнопку, он запускается слушателя последней кнопки, которую я создал (функция OpenPdf имеет в качестве parm последнее значение «str» в цикле foreach).

ответ

0

Я предполагаю, что проблема связана с этим: Access to Modified Closure

пытаются работать с копией строки

foreach (string str in _scene.PDF_ITEMS) 
{ 
    string strCopy = string.Copy(str); 
    button = (GameObject)Instantiate(_primitive); 
    button.GetComponent<Button>().onClick.AddListener(() => OpenPDF(strCopy)); 
    button.GetComponentInChildren<Text>().text = str; 
    button.GetComponent<Transform>().SetParent(this.transform, false); 
    GetComponent<RectTransform>().anchorMin = Vector2.zero; 
    GetComponent<RectTransform>().anchorMax = Vector2.one; 
    width++; 
} 
+0

ИТАК проблема заключается в том, что я дать указатель ул OBJ тогда, когда я изменить тэ str i изменить весь элемент, связанный с объектом? – MaGiiK

+0

@MaGiiK, вид. Foreach изменяет эту ссылку, которую захватывает ваше закрытие. –

+0

Хорошо, спасибо, что вы попали в проблему! – MaGiiK