local function networkCB(msgID, msgData)
local parent = GUI:Attach_RightTop()
local ui = GUI:ui_delegate(parent)
local tag = GUI:getTag(ui['bt_11'])
SL:print(tag)
if tag == -1 then
GUI:setTag(ui['bt_11'],1)
GUI:ad
看了你的代码,主要问题是 `tag` 变量的作用域和逻辑流程。让我帮你分析一下:
```lua
local function networkCB(msgID, msgData)
local parent = GUI:Attach_RightTop()
local ui = GUI:ui_delegate(parent)
local tag = GUI:getTag(ui['bt_11']) -- 每次都会重新获取tag
SL:Print(tag)
if tag == -1 then
GUI:setTag(ui['bt_11'], 1)
GUI:addOnClickEvent(ui['bt_11'], function()
for i = 1, 10 do
GUI:setOpacity(ui['bt_'..i], 255)
local fadeOutAction = GUI:ActionFadeTo(0.5, 0)
local hideFunc = GUI:CallFunc(function()
GUI:setVisible(ui['bt_'..i], false)
end)
GUI:runAction(ui['bt_'..i], GUI:ActionSequence(fadeOutAction, hideFunc))
end
end)
elseif tag == 1 then
GUI:setTag(ui['bt_11'], -1)
end
end
SL:RegisterNetMsg(1000, networkCB)
```
**问题分析:**
1. **每次都会重新创建界面**:`GUI:Attach_RightTop()` 和 `GUI:ui_delegate(parent)` 每次网络回调都会执行,这会导致界面被重复创建
2. **事件重复绑定**:当 `tag == -1` 时,你会给按钮添加点击事件,但下次网络消息过来时,如果 `tag == 1`,你只是修改了tag值,没有移除之前的事件监听
3. **逻辑流程问题**:
- 第一次:`tag == -1` → 设置tag为1,添加点击事件
- 第二次:`tag == 1` → 设置tag为-1,但没有移除点击事件
- 第三次:`tag == -1` → 又添加一次点击事件(重复了!)
**建议的修改方案:**
```lua
-- 在外部定义变量,避免每次重新创建
local isInitialized = false
local uiTable = nil
local function networkCB(msgID, msgData)
if not isInitialized then
local parent = GUI:Attach_RightTop()
uiTable = GUI:ui_delegate(parent)
isInitialized = true
end
if not uiTable or GUI:Win_IsNull(uiTable['bt_11']) then
return
end
local tag = GUI:getTag(uiTable['bt_11'])
SL:Print("当前tag值:", tag)
if tag == -1 then
GUI:setTag(uiTable['bt_11'], 1)
-- 先移除可能存在的旧事件
GUI:removeOnClickEvent(uiTable['bt_11'])
GUI:addOnClickEvent(uiTable['bt_11'], function()
SL:Print("按钮被点击了!")
for i = 1, 10 do
if uiTable['bt_'..i] and not GUI:Win_IsNull(uiTable['bt_'..i]) then
GUI:setOpacity(uiTable['bt_'..i], 255)
local fadeOutAction = GUI:ActionFadeTo(0.5, 0)
local hideFunc = GUI:CallFunc(function()
GUI:setVisible(uiTable['bt_'..i], false)
end)
GUI:runAction(uiTable['bt_'..i], GUI:ActionSequence(fadeOutAction, hideFunc))
end
end
end)
elseif tag == 1 then
GUI:setTag(uiTable['bt_11'], -1)
-- 移除点击事件
GUI:removeOnClickEvent(uiTable['bt_11'])
end
end
SL:RegisterNetMsg(1000, networkCB)
```
**关键修改点:**
1. **使用外部变量**:`isInitialized` 和 `uiTable` 放在函数外部,避免重复创建
2. **空值检查**:使用 `GUI:Win_IsNull()` 检查控件是否有效
3. **事件管理**:在重新绑定事件前,先移除旧的事件监听
4. **错误处理**:添加了控件存在性检查
这样修改后,每次网络消息都会正常执行,`SL:Print(tag)` 也会正常打印。如果还有问题,可以检查网络消息是否真的发送了多次。