diff --git a/03_核心功能/UI/UI开发指南.md b/03_核心功能/UI/UI开发指南.md index 31ad8f1..8d1fd02 100644 --- a/03_核心功能/UI/UI开发指南.md +++ b/03_核心功能/UI/UI开发指南.md @@ -32,10 +32,14 @@ public class MyWindow : AbsHFUIWindow | 方法 | 调用时机 | 推荐操作 | |-----|---------|---------| -| `OnRunAwake` | 创建时一次 | 绑定UI事件 | -| `OnOpen` | 每次打开 | 注册TC事件、刷新数据 | +| `OnRunAwake` | 创建时一次 | 绑定UI事件、初始化滚动列表 `BindEvent` | +| `OnOpen` | 每次打开 | 注册TC事件、调用 `ShowView()` 刷新数据 | | `OnClose` | 每次关闭 | 取消TC事件 | +**关键原则**: +- **绑定类操作**(如 `BindEvent`)放在 `OnRunAwake`,只需执行一次 +- **刷新类操作**(如 `ShowView`)放在 `OnOpen`,每次打开都需执行 + ### 1.3 窗口操作 ```csharp // 打开 @@ -77,17 +81,46 @@ img.HFSetSprite(/* atlasName */, "Icon_Player", /* languageRoot */); ``` ### 3.4 滚动列表(核心) + +**生命周期正确划分示例**: + ```csharp -SFUI_ScrollRect scroll = GetComponent(); -scroll.BindEvent( - () => itemList.Count, - (idx) => itemPrefab.gameObject, - OnUpdateItem, - (item) => item.gameObject.HFGetOrAddSimulateBehaviour() -); -scroll.ShowView(); +private SFUI_ScrollRect m_ScrollList; +private List m_ItemList; + +protected override void OnRunAwake() +{ + base.OnRunAwake(); + m_ScrollList = FindUICtrlByName("ScrollList"); + + // ✅ 绑定事件放在 Awake(一次绑定,永久生效) + m_ScrollList.BindEvent( + () => m_ItemList.Count, // 数据源闭包 + (idx) => itemPrefab.gameObject, // 生成预制体 + OnUpdateItem, // 更新回调 + (item) => item.gameObject.HFGetOrAddSimulateBehaviour() // 获取组件 + ); +} + +protected override void OnOpen(Action _onOpenComplete) +{ + base.OnOpen(_onOpenComplete); + m_ItemList = GetDataFromServer(); // 获取最新数据 + m_ScrollList.ShowView(); // ✅ 刷新显示放在 Open +} + +private void OnUpdateItem(int index, AbsHFUIWindow window) +{ + ItemSlot slot = window as ItemSlot; + slot.SetData(m_ItemList[index]); +} ``` +**设计要点**: +- `BindEvent` 在 `OnRunAwake` 中执行,建立绑定机制 +- `ShowView` 在 `OnOpen` 中执行,触发数据刷新 +- 数据源通过闭包引用,`ShowView` 时自动获取最新数据 + --- ## 四、对象池