Unity UGUI Toggle监听onValueChanged
一直以为下面代码是监听toggle点击的。。。其实不是,他是用来监听 isOn值的改变的,真的好坑。。
Toggle.onValueChanged.AddListener((bool value) => resultToggleChange(Toggle, value));
void resultToggleChange(Toggle toggle, bool value){}
这里Lambda表达式的bool value就是 isOn的值,如果改成直接回调方法会直观些:
void Awake()
{
//添加监听
GetComponent<Toggle>().onValueChanged.AddListener(ResultToggleChange);
}
void Start()
{
//设置初始状态
ResultToggleChange(GetComponent<Toggle>().isOn);
}
private void ResultToggleChange(bool value)
{
if (value)
{
//选中了的逻辑
}
}
脚本上添加监听
onValueChanged.AddListener(方法名或用Lambda表达式)
void Awake()
{
//添加监听
GetComponent<Toggle>().onValueChanged.AddListener(OnValueChanged);
}
void Start()
{
//设置初始状态
OnValueChanged(GetComponent<Toggle>().isOn);
}
private void OnValueChanged(bool value)
{
if (value)
{
//选中了的逻辑
}
}
或
GetComponent<Toggle>().onValueChanged.AddListener((bool value)=>
{
if (value)
{
//选中了的逻辑
}
});
- 第一个坑是,容易忽略Toggle组件的onClick.AddListener()方法,只有在属性isOn有变化的时候才会触发这个AddListener()监听。明确的来说,这个坑点不算是坑,是自己没有理解到位这个方法的使用,这里主要容易踩坑的地方是,UI预制体默认勾选了其中一个Toggle的isOn,然后想默认打开某个界面UI的时候,刚好也想默认触发这个Toggle的监听方法:
private void Event()
{
toggl1.onClick.AddListener(isOn => if(isOn) Fun());
}
public void Open()
{
toggle1.isOn = true;//想默认触发toggle1监听的方法
}
最后的结果是:由于toggle1的isOn已经默认勾选了,再设置它的isOn值为true,因为isOn的值并没有发生变化,所以并不会触发监听的方法。我的解决办法是:
public void Open()
{
toggle1.isOn = false;//先置为false;
toggle2.isOn = false;//先置为false;
toggle3.isOn = false;//先置为false;
toggle1.isOn = true;//想默认触发toggle1监听的方法
}
- 第二个比较坑的点是,Toggle组件在父物体或者界面关闭隐藏之后,Toggle的属性isOn的值并不会被设置为false。这个情况很容易被忽视,当有上面那种情况,打开界面触发某个方法事件的时候,由于isOn的值并没有发生变化,所以也不会触发监听的事件。所以像这种情况,依然可以用上面的方法解决。