【C#】每次调用Back的时候都会退到root界面,想问如何改进
答案:1 悬赏:30 手机版
解决时间 2021-03-25 19:18
- 提问者网友:且恨且铭记
- 2021-03-25 12:07
【C#】每次调用Back的时候都会退到root界面,想问如何改进
最佳答案
- 五星知识达人网友:千夜
- 2021-03-25 13:40
最后一句
UIChildArray.ForEach(item => item.Back()); //把每个子UI都关闭
改成
UIChildArray[0].Back(); //只关闭一个子UI追问back不执行关闭 作为递归使用,让子状态判断自己是不是要把自己关掉 close方法执行关闭,方法内容是,如果自身是根UI则不关闭,否则关闭自身追答关闭“目标”的话,直接调用目标的back即可。是不是调用了root的Back了?追问调用root 的back back的内容是判断自己是否需要被关闭,否则遍历子集,让每一子对象都执行back 负责关闭的是close 当需要关闭自身的时候执行close方法,如果不需要关闭自身就遍历子集,让每一子对象都执行back 形成递归追答不是看不懂你的代码,而是想和你确认一下,原始的设计思路是什么样的。新代码尽量按照原来的思路去做。如果你需要变更功能,必须确保原有思路中所有的地方(比如:子集何时被修改)都不会受影响。
你自己也说了,它是遍历子集,让每个子对象都执行Back的。
可是代码里,一个没有子对象的对象,执行Back的动作,就是做Close。换句话说,对某个UI执行了Back,就是让它自己以及它的子UI都关闭。(我认为这里有个BUG,后述)
代码执行了以后的效果:父对象做Back时会遍历子对象,子对象 没有孙子对象时,会导致子对象都被Close。但是当有孙子对象时,并不关闭儿子节点,而去遍历孙子对象的Back。
按照通常的做法,如果有下级节点,那么遍历下级节点进行关闭。然后用递归方法遍历所有节点。但是你这里和通常做法,稍有不同。通常情况下,遍历完子节点后(即子节点都被关闭后),需要把当前节点也关闭掉。你的原始代码里,没有关闭自己的动作。
所以我不确定,你关闭一个UI时,是调用UI自己的Back,还是调用root的Back。
上面讨论的都是你的原始代码。
关于你的修改,其实很简单。想要把“关闭所有UI”改成“关闭一个UI”,只要做到两点:
把遍历关闭,改成只关闭一个
找到被关闭的UI对象
追问可是我想设计成只有rootUI调用Back方法,但是可以关掉最末端(树形结构树枝)正在运行中的UI追答那你需要做到:
记录下最末端节点,以及各UI的开启顺序(可以利用你现有的List)。
遍历所有节点,查找最末端节点并关闭(一旦找到,就不再继续遍历)。
你的代码里,List好像能做到第一点(没看到插入List的源代码,不太确定)。ForEach能做到遍历。但是确少“查找最末端节点并关闭”的处理,以及“一旦找到,就不再继续遍历”的处理。
追问理解你的意思,但是我在back里面就想实现“判断自身是不是正在运行中的末端节点”,已经符合“无子节点”“子节点无运行”的条件了,已经没必要关闭自身了但是我大致感觉得到有BUG存在,在我之前写的UI系统里面没有这情况,这一次写是希望简化结构构造的过程,
原先是new每一个UIObject 然后用方法建立父子联系
现在是在构造的时候传入子对象List,然后递归遍历,让为每个子对象的父对象参数赋值this追答你想做的事情是,让Back的功能是“查找末端节点,但是不关闭它”,是这个意思吗?如果是,那要Back干嘛,新写一个SearchLastNode()函数得了。
UIChildArray.ForEach(item => item.Back()); //把每个子UI都关闭
改成
UIChildArray[0].Back(); //只关闭一个子UI追问back不执行关闭 作为递归使用,让子状态判断自己是不是要把自己关掉 close方法执行关闭,方法内容是,如果自身是根UI则不关闭,否则关闭自身追答关闭“目标”的话,直接调用目标的back即可。是不是调用了root的Back了?追问调用root 的back back的内容是判断自己是否需要被关闭,否则遍历子集,让每一子对象都执行back 负责关闭的是close 当需要关闭自身的时候执行close方法,如果不需要关闭自身就遍历子集,让每一子对象都执行back 形成递归追答不是看不懂你的代码,而是想和你确认一下,原始的设计思路是什么样的。新代码尽量按照原来的思路去做。如果你需要变更功能,必须确保原有思路中所有的地方(比如:子集何时被修改)都不会受影响。
你自己也说了,它是遍历子集,让每个子对象都执行Back的。
可是代码里,一个没有子对象的对象,执行Back的动作,就是做Close。换句话说,对某个UI执行了Back,就是让它自己以及它的子UI都关闭。(我认为这里有个BUG,后述)
代码执行了以后的效果:父对象做Back时会遍历子对象,子对象 没有孙子对象时,会导致子对象都被Close。但是当有孙子对象时,并不关闭儿子节点,而去遍历孙子对象的Back。
按照通常的做法,如果有下级节点,那么遍历下级节点进行关闭。然后用递归方法遍历所有节点。但是你这里和通常做法,稍有不同。通常情况下,遍历完子节点后(即子节点都被关闭后),需要把当前节点也关闭掉。你的原始代码里,没有关闭自己的动作。
所以我不确定,你关闭一个UI时,是调用UI自己的Back,还是调用root的Back。
上面讨论的都是你的原始代码。
关于你的修改,其实很简单。想要把“关闭所有UI”改成“关闭一个UI”,只要做到两点:
把遍历关闭,改成只关闭一个
找到被关闭的UI对象
追问可是我想设计成只有rootUI调用Back方法,但是可以关掉最末端(树形结构树枝)正在运行中的UI追答那你需要做到:
记录下最末端节点,以及各UI的开启顺序(可以利用你现有的List)。
遍历所有节点,查找最末端节点并关闭(一旦找到,就不再继续遍历)。
你的代码里,List好像能做到第一点(没看到插入List的源代码,不太确定)。ForEach能做到遍历。但是确少“查找最末端节点并关闭”的处理,以及“一旦找到,就不再继续遍历”的处理。
追问理解你的意思,但是我在back里面就想实现“判断自身是不是正在运行中的末端节点”,已经符合“无子节点”“子节点无运行”的条件了,已经没必要关闭自身了但是我大致感觉得到有BUG存在,在我之前写的UI系统里面没有这情况,这一次写是希望简化结构构造的过程,
原先是new每一个UIObject 然后用方法建立父子联系
现在是在构造的时候传入子对象List,然后递归遍历,让为每个子对象的父对象参数赋值this追答你想做的事情是,让Back的功能是“查找末端节点,但是不关闭它”,是这个意思吗?如果是,那要Back干嘛,新写一个SearchLastNode()函数得了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯