修正生命周期职责划分:BindEvent应放在OnRunAwake,ShowView放在OnOpen
This commit is contained in:
@@ -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");
|
||||||
|
|
||||||
|
// ✅ 绑定事件放在 Awake(一次绑定,永久生效)
|
||||||
|
m_ScrollList.BindEvent(
|
||||||
|
() => m_ItemList.Count, // 数据源闭包
|
||||||
|
(idx) => itemPrefab.gameObject, // 生成预制体
|
||||||
|
OnUpdateItem, // 更新回调
|
||||||
|
(item) => item.gameObject.HFGetOrAddSimulateBehaviour<ItemSlot>() // 获取组件
|
||||||
);
|
);
|
||||||
scroll.ShowView();
|
}
|
||||||
|
|
||||||
|
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` 时自动获取最新数据
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 四、对象池
|
## 四、对象池
|
||||||
|
|||||||
Reference in New Issue
Block a user