【问题标题】:Unity - one Dropdown callback for multiple Dropdown componentsUnity - 多个 Dropdown 组件的一个 Dropdown 回调
【发布时间】:2020-05-27 18:44:40
【问题描述】:

我有一个带有许多下拉控件的 UI,每个控件都会影响一个数组或项。我使用 onValueChanged(int index),每个都连接到自己的侦听器(selected01()、selected02() ... 等)。

这有点乱。最好有一个回调 - selected(Dropdown instance, int index) - 处理所有这些。回调将从实例参数中识别控件并作用于适当的数组项。

我看不出该怎么做——onValueChanged() 只提供一个索引而不是源。然而我确信我已经看到了解决这个问题的方法,可能涉及一个代表,但现在找不到它。

有什么建议吗? (这同样适用于任何控件数组,而不仅仅是下拉菜单)。

【问题讨论】:

    标签: c# unity3d dropdown


    【解决方案1】:

    据我所知,onValueChanged 无论如何都会返回已更改的DropDown 实例。


    也许你使用的版本不同。

    您可以简单地创建自己的侦听器方法并执行例如

    public DropDown[] dropdowns;
    
    private void HandleChange(DropDown dropdown, int newIndex)
    {
        // Your stuff here
    }
    
    ...
    
    foreach(var dropdown in dropdowns)
    {
        var currentDropdown = dropdown;
        currentDropdown.onValueChanged.AddListener((newIndex) => { HandleChange(currentDropdown, newIndex); });
    }
    

    【讨论】:

    • 啊,有用。你是在哪里找到那个东西的。从我可以看到 onValueChanged() 仅将索引作为参数传递,而不是实例和索引? (我只是在看检查员显示的被传回的内容)。我正在使用(几乎)Unity 工具的最新版本,2019.3.14F1。
    • 啊不,我知道了。不熟悉 lambda 表达式(我来自 C++ 领域),但似乎 lambda 表达式有效地为 Dropdown 数组中的每个元素创建了一个匿名函数,然后使用额外参数调用通用处理程序,即 Dropdown实例。对吗?
    • @nmw01223 是的。 lambda 表达式基本上“知道”给定的参数类型(在本例中为 (int newIndex)),=> 之后的部分基本上是使用该参数调用的匿名函数。在那里你可以 - 就像这里所做的那样 - 只需使用附加参数调用你的目标方法 - 在这种情况下是 currentDropdown 参考
    • 谢谢。将此标记为答案。编译器推断数据类型有点不安,但它似乎工作。用一些标准方法为自己创建了一个实用程序类,它们工作正常。我想关键是仍然需要每个回调数组项的各个函数,但是这样编译器会自动创建它们,而不是我手动创建它们 - 乏味且容易出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多