Ugui中Toggle.isOn 设置以后显示但不是设置的结果

事情是这样的:业务逻辑中有大量选择顶,使用Toggle来做功能的选择,在多级目录功能下展开项时经常会碰到展开页中子内容默认首页功能。同时下次再次展开时清除上次的记录且打开首页

核心:内容默认首页 +时清除上次的选择记录

如是我增加了三个组件 1   ToggleRestore挂在ToggleGroup中, 2 DefaultToggleOn(空组件啥内容也没有)标记这个toggle默认下应该是Ison =true  3 DefaultAllowOFF(空组件啥内容也没有)标记这个group 允许关

 1 /// ***********************************************************************
 2 ///
 3 /// 创 建 者    :stweily
 4 /// 创建日期    :#2021/4/27# 
 5 /// 功能描述    :查找所有子物体中的Toggle 每次重新打开时清除上次操作的记录
 6 /// 使用说明    :挂在一系列Toggle的父物体上
 7 /// =================================
 8 /// 修改者    :
 9 /// 修改日期    :
10 /// 修改内容    :
11 /// =================================
12 ///
13 /// ***********************************************************************
14 
15 using System.Collections;
16 using System.Collections.Generic;
17 using UnityEngine;
18 using UnityEngine.UI;
19 
20 public class ToggleRestore : MonoBehaviour
21 {
22     private void OnEnable()
23     {
24         Toggle[] togs = GetComponentsInChildren<Toggle>(true);
25         ToggleGroup tg = GetComponent<ToggleGroup>();
26         if (tg != null)
27         {
28             tg.allowSwitchOff = tg.GetComponent<DefaultAllowOFF>() != null;
29         }
30         foreach (var tog in togs)
31         {
32             if (tog.transform.parent == this.transform)
33             {
34                 bool origin = tog.gameObject.GetComponent<DefaultToggleOn>() != null && CheckName(tog.gameObject.name);
35                 if (tog.isOn == origin)
36                     tog.onValueChanged.Invoke(origin);
37                 else
38                 {
39                     tog.isOn = origin;
40                     tog.onValueChanged.Invoke(origin);
41                 }
42                     
43             }
44         }
45     }
46     bool CheckName(string name)
47     {
48         if (name == "平铺")
49             return false;
50         else
51             return true;
52     }
53 }

结果发现,tog.isOn = origin;设置完以后实际并没有设置成功。

猜想。。。。做小测拭都正常,那就是什么机制使设置不了或是失败了。

研究良久发现=>ToggleGroup组中,,不允许关的时候。。再好要关那一个时。。不就关不掉了吗?

改一下逻辑

 1  private void OnEnable()
 2     {
 3         Toggle[] togs = GetComponentsInChildren<Toggle>(true);
 4         ToggleGroup tg = GetComponent<ToggleGroup>();
 5         if (tg != null)
 6         {
 7             tg.allowSwitchOff = true;
 8         }
 9         foreach (var tog in togs)
10         {
11             if (tog.transform.parent == this.transform)
12             {
13                 bool origin = tog.gameObject.GetComponent<DefaultToggleOn>() != null && CheckName(tog.gameObject.name);
14                 if (tog.isOn == origin)
15                     tog.onValueChanged.Invoke(origin);
16                 else
17                 {
18                     tog.isOn = origin;
19                     tog.onValueChanged.Invoke(origin);
20                 }
21                     
22             }
23         }
24         if (tg != null)
25         {
26             tg.allowSwitchOff = tg.GetComponent<DefaultAllowOFF>() != null;
27         }
28     }
29     bool CheckName(string name)
30     {
31         if (name == "平铺")
32             return false;
33         else
34             return true;
35     }

发现一切正常了。也就是先把组中不让关先给去掉。最后再给设置上。

故在博客中记录这个小坑。同时猜想一下在组中不允许开的时候手动Inspector面板强制操作破坏这种会是什么效果呢?小伙伴可以亲自动手拭下。

 

posted @ 2021-10-18 22:25  stweily  阅读(335)  评论(0编辑  收藏  举报