我在Content对象上有一个ScrollView,它的分量是Grid Layout Group:

enter image description here

我的项目列表在Content对象中,每个项目都有一个Button组件.

我try 以编程方式添加onClick来处理大量对象和索引,并使用如下参数:

        int i = 0;
        foreach(Button btn in scrollViewContent.GetComponentsInChildren<Button>()) {
            btn.onClick.AddListener(() => Load(i));
            i++;
        }

然而,onClick我总是得到最后一个指数+1的所有项目点击.以下是我的日志(log):

enter image description here

直到Log 44,这是foreach打印循环,Log"index:45"是点击的结果.

所以有两个问题:

·为什么所有项目点击都会返回相同的索引?

·i var停在44时,我如何得到index 45?

推荐答案

问题是回调函数都使用相同的变量. 这可能看起来很奇怪,因为int是一种值类型,必须复制. 但是,变量是在局部作用域中捕获的,导致所有回调都使用相同的变量.

要解决该问题,请在Foreach循环中创建一个新的局部变量.

var i = 0;

foreach (var button in buttons)
{
    var index = i++;

    button.onClick.AddListener(() => Load(index)); 
}

Csharp相关问答推荐

使用GeneratedComInterfaceProperty的.NET 8 COM类对于VB 6/SYS或ALEViewer不可见

Regex在c#中完全匹配

编写DataAnnotations自定义验证器的多种方法

安装附加的. exe与Visual Studio

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

在实时数据库中匹配两个玩家的问题

具有单一导航属性的EF核心一对多关系

方法从数据表中只 Select 一个条件?

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

如何在C#中将方法/线程启动传递给基本构造函数

C#Null判断处理失败

为值对象编写自定义JsonConverter

.NET 8在appsettings.json中核心使用词典URI、URI&>

如何在GRPC代码First服务的返回类型上使用多态性?

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

Blazor服务器项目中的Blazor/.NET 8/Web API不工作

WPF:如何从DatagridHeader的内容模板绑定到词典项

如何在特定时间间隔运行多个后台任务?

使用LibraryImport在多个dll中导入相同的函数

ASP.NET核心MVC|如何在控制器方法之间传递值