版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010848412/article/details/78218184
通常在设计ui框架的时候,会以类似栈的数据结构(非栈)进行存储管理,将打开界面进行入栈操作,将关闭界面进行出栈操作。
同时,在打开某界面的时候,可能将上个界面隐藏,在关闭这个界面的时候,恢复显示上个界面。
大致代码如下:
private void PushPanel(Panel panel, bool hidePrev = true)
{
if (panel == null)
{
return;
}
//隐藏之前界面
if (hidePrev && panelStacks.Coun > 0)
{
panelStacks[panelStacks.Count - 1].HidePanel();
}
//入栈
panelStacks.Add(panel);
}
private void PopPanel(Panel panel, bool showPrev = true)
{
if (panel == null)
{
return;
}
if (panelStacks.Count > 0)
{
//出栈
panelStacks.RemoveAt(panelStacks.Count - 1);
//恢复之前界面
if(showPrev && panelStacks.Count > 0)
{
panelStacks[panelStacks.Count - 1].ShowPanel();
}
}
}
假设已经打开了界面A。此时记录的信息为{A(show)}
打开界面B,设置隐藏上个界面。此时记录的信息为{A(hide), B(show)}
此时,再打开界面C,不设定隐藏上个界面。此时记录的信息为{A(hide), B(show), C(show)}
设定界面C的层级在B的下面,所以,玩家看到的界面还是界面B,而实际存放的栈顶是界面C。
将界面B关掉。此时记录的信息为{A(hide), B(show)}
将界面C关掉。此时记录的信息为{A(hide)}
可以看到,此时还存留一个隐藏的界面A。无法被正常的关闭。
解决方案:
1)打开界面,不能简单以时间为顺序进行入栈,还应该判断对应的层级关系。
2)关闭界面时,不能单纯以栈顶进行索引,最好以名称进行索引,才不会出现顺序错乱。