From f1e45385c4da95ac40b6eacf81f6d6387094d479 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Fri, 6 Feb 2026 23:14:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ui):=20=E9=87=8D=E6=9E=84UI=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=9F=BA=E7=A1=80=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除Show方法中基于实例的显示功能,简化接口设计 - 改进Hide方法实现,支持永久销毁和临时隐藏两种模式 - 添加Resume方法用于恢复已隐藏的UI界面 - 更新XML文档注释,提供更清晰的参数说明 - 优化代码结构和注释,提升代码可读性 - 调整IUiRouter接口定义,保持API一致性 - [release ci] --- GFramework.Game.Abstractions/ui/IUiRouter.cs | 26 ++++----- GFramework.Game/ui/UiRouterBase.cs | 61 ++++++++++---------- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/GFramework.Game.Abstractions/ui/IUiRouter.cs b/GFramework.Game.Abstractions/ui/IUiRouter.cs index 14b3556..db92195 100644 --- a/GFramework.Game.Abstractions/ui/IUiRouter.cs +++ b/GFramework.Game.Abstractions/ui/IUiRouter.cs @@ -147,29 +147,27 @@ public interface IUiRouter : ISystem UiLayer layer, IUiPageEnterParam? param = null); - /// - /// 在指定层级显示UI(Overlay / Modal / Toast等) - /// - /// 要显示的UI页面行为对象 - /// UI显示的层级,例如 Overlay、Modal 或 Toast - /// 传递给UI页面的初始化数据 - /// 是否立即进入UI页面,默认为 false - void Show( - IUiPageBehavior page, - UiLayer layer, - IUiPageEnterParam? param, - bool enter = false); - /// /// 在指定层级显示UI(基于已存在实例) /// void Show(IUiPageBehavior page, UiLayer layer); /// - /// 隐藏指定层级的UI + /// 隐藏指定层级的UI。 /// + /// 要隐藏的UI的唯一标识符。 + /// 指定UI所在的层级。 + /// 是否销毁UI对象,默认为false,表示仅隐藏而不销毁。 void Hide(string uiKey, UiLayer layer, bool destroy = false); + /// + /// 恢复指定层级的UI显示。 + /// + /// 要恢复显示的UI的唯一标识符。 + /// 指定UI所在的层级。 + void Resume(string uiKey, UiLayer layer); + + /// /// 清空指定层级的所有UI /// diff --git a/GFramework.Game/ui/UiRouterBase.cs b/GFramework.Game/ui/UiRouterBase.cs index e7f272f..d5fddb8 100644 --- a/GFramework.Game/ui/UiRouterBase.cs +++ b/GFramework.Game/ui/UiRouterBase.cs @@ -518,47 +518,24 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 在指定层级显示UI(基于实例) - /// - public void Show( - IUiPageBehavior page, - UiLayer layer, - IUiPageEnterParam? param, - bool enter = false) - { - if (layer == UiLayer.Page) - throw new ArgumentException("Use Push() for Page layer"); - - var uiKey = page.Key; - - if (!_layers.ContainsKey(layer)) - _layers[layer] = new Dictionary(); - - _layers[layer][uiKey] = page; - _uiRoot.AddUiPage(page, layer); - - if (enter) - page.OnEnter(param); - - page.OnShow(); - - Log.Debug("Show existing UI instance in layer: {0}, layer={1}", uiKey, layer); - } - - /// - /// 隐藏指定层级的UI + /// 隐藏指定层级的UI。 /// + /// 要隐藏的UI的唯一标识符。 + /// UI所在的层级。 + /// 是否永久销毁UI。如果为true,则UI将被彻底移除;如果为false,则UI仅被隐藏,可后续恢复。 public void Hide(string uiKey, UiLayer layer, bool destroy = false) { + // 尝试获取指定层级的UI字典,若不存在则直接返回 if (!_layers.TryGetValue(layer, out var layerDict)) return; + // 尝试获取指定UI键对应的页面对象,若不存在则直接返回 if (!layerDict.TryGetValue(uiKey, out var page)) return; if (destroy) { - // 永久移除 + // 永久移除UI:调用OnExit方法并从UI根节点和层级字典中移除该UI page.OnExit(); // ✅ 只在 Destroy 时 Exit _uiRoot.RemoveUiPage(page); layerDict.Remove(uiKey); @@ -570,7 +547,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } else { - // 临时隐藏(可恢复) + // 临时隐藏UI:调用OnHide方法,保留UI状态以便后续恢复 page.OnHide(); // ✅ Hide ≠ Exit Log.Debug( @@ -580,6 +557,28 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } } + /// + /// 恢复指定层级中已隐藏的UI。 + /// + /// 要恢复的UI的唯一标识符。 + /// UI所在的层级。 + public void Resume(string uiKey, UiLayer layer) + { + // 尝试获取指定层级的UI字典,若不存在则直接返回 + if (!_layers.TryGetValue(layer, out var layerDict)) + return; + + // 尝试获取指定UI键对应的页面对象,若不存在则直接返回 + if (!layerDict.TryGetValue(uiKey, out var page)) + return; + + // 调用OnShow和OnResume方法以恢复UI的显示和状态 + page.OnShow(); + page.OnResume(); + + Log.Debug("Resume UI in layer: {0}, layer={1}", uiKey, layer); + } + /// /// 清空指定层级的所有UI ///