添加复杂的Click事件HoloLens

问题描述

摘要:

  • 目标:在开始时创建动态目录
  • 预期结果:如果用户单击与页面x对应的按钮,则将用户定向到页面x
  • 实际结果:如果用户单击与页面x对应的按钮,则用户将被定向到最后一页

我尝试过的事情:

public static void AddOnClick(Interactable interactable)
{
    interactable.OnClick.AddListener(() => Debug.Log("Interactable clicked"));
}

代码:目录=目录

private void TOCpage()
{
    GameObject TOC = new GameObject(); // holds table of contents buttons
    for(int i = 1; 1 <= pages.Count - 1; i++)
    {
        GameObject TOCgameObject = (GameObject)Instantiate(TOCButtonPrefab);
        var TOCButton = TOCgameObject.GetComponent<Interactable>();
        TOCbutton.OnClick.AddListener(() => TaskOnClick(i));
    }
}

public void TaskOnClick(int TOCButtonNumber)
{
    Debug.Log("Table of contents button number " + TOCButtonNumber + " clicked");
}

如果用户单击第1页的“目录”按钮,并且有7页,则将用户定向到第7页。

解决方法

TOCbutton.OnClick.AddListener(()=> TaskOnClick(i));

之所以会发生这种情况,是因为i并不是lambda的局部变量,而是在外部范围中定义的,并且在调用lambda时将对其进行访问,而不是在定义时进行访问。在循环结束时,i的值为7,因此所有函数均记录为7。

相反,您可以在循环内创建一个局部变量,并为其指定迭代变量的值,或者使用foreach语句在C#5.0或更高版本中使用它。

作为解决方案,您可以参考以下代码:

        foreach (var i in Enumerable.Range(1,pages.Count))
        {
           GameObject TOCgameObject = (GameObject)Instantiate(TOCButtonPrefab);
           var TOCButton = TOCgameObject.GetComponent<Interactable>();
           TOCbutton.OnClick.AddListener(() => TaskOnClick(i));
        }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...