Unity 5 修复 Listener 调用
Unity 5 fix Listener calls
我在 Unity 5 中使用运行时生成的按钮时遇到问题。
按钮创建正确,但我的听众有一些问题。
我使用此代码创建按钮:
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 函数将 foreach 中的最后一个 "str" 值作为参数周期)。
我假设您的问题与此有关:
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++;
}
我在 Unity 5 中使用运行时生成的按钮时遇到问题。 按钮创建正确,但我的听众有一些问题。 我使用此代码创建按钮:
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 函数将 foreach 中的最后一个 "str" 值作为参数周期)。
我假设您的问题与此有关: 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++;
}