修正生命周期职责划分:BindEvent应放在OnRunAwake,ShowView放在OnOpen

This commit is contained in:
Shiliang
2026-05-27 16:44:46 +08:00
parent cc3938d5f4
commit 36df43fd55

View File

@@ -32,10 +32,14 @@ public class MyWindow : AbsHFUIWindow
| 方法 | 调用时机 | 推荐操作 | | 方法 | 调用时机 | 推荐操作 |
|-----|---------|---------| |-----|---------|---------|
| `OnRunAwake` | 创建时一次 | 绑定UI事件 | | `OnRunAwake` | 创建时一次 | 绑定UI事件、初始化滚动列表 `BindEvent` |
| `OnOpen` | 每次打开 | 注册TC事件、刷新数据 | | `OnOpen` | 每次打开 | 注册TC事件、调用 `ShowView()` 刷新数据 |
| `OnClose` | 每次关闭 | 取消TC事件 | | `OnClose` | 每次关闭 | 取消TC事件 |
**关键原则**
- **绑定类操作**(如 `BindEvent`)放在 `OnRunAwake`,只需执行一次
- **刷新类操作**(如 `ShowView`)放在 `OnOpen`,每次打开都需执行
### 1.3 窗口操作 ### 1.3 窗口操作
```csharp ```csharp
// 打开 // 打开
@@ -77,17 +81,46 @@ img.HFSetSprite(/* atlasName */, "Icon_Player", /* languageRoot */);
``` ```
### 3.4 滚动列表(核心) ### 3.4 滚动列表(核心)
**生命周期正确划分示例**
```csharp ```csharp
SFUI_ScrollRect scroll = GetComponent<SFUI_ScrollRect>(); private SFUI_ScrollRect m_ScrollList;
scroll.BindEvent( private List<ItemData> m_ItemList;
() => itemList.Count,
(idx) => itemPrefab.gameObject, protected override void OnRunAwake()
OnUpdateItem, {
(item) => item.gameObject.HFGetOrAddSimulateBehaviour<ItemSlot>() base.OnRunAwake();
); m_ScrollList = FindUICtrlByName<SFUI_ScrollRect>("ScrollList");
scroll.ShowView();
// ✅ 绑定事件放在 Awake一次绑定永久生效
m_ScrollList.BindEvent(
() => m_ItemList.Count, // 数据源闭包
(idx) => itemPrefab.gameObject, // 生成预制体
OnUpdateItem, // 更新回调
(item) => item.gameObject.HFGetOrAddSimulateBehaviour<ItemSlot>() // 获取组件
);
}
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` 时自动获取最新数据
--- ---
## 四、对象池 ## 四、对象池