看了你的代码,问题主要出在 `switch_interface` 函数中。错误信息 "target is invalid cobj" 和 "target is nil value" 表明,你在尝试操作一个无效或未正确获取到的UI控件。
根据浮生梦老师前端课程内容,我们来分析并修复你的代码:
**主要问题:**
1. **错误的控件获取方式:** 你试图通过 `GUI:ui_delegate(npc.bg[i].Width)` 来获取已经通过 `GUI:ui_delegate` 处理过的控件,这会导致循环引用和控件对象失效。
2. **数据结构混乱:** `npc.bg` 表的结构设计不合理,存储了控件对象又存储 `GUI:ui_delegate` 的结果,导致数据混乱。
3. **事件重复绑定:** 在循环中每次切换界面都会重新绑定按钮事件,可能导致事件重复绑定或绑定到无效控件上。
**修复后的代码:**
```lua
local npc = {}
npc.__cname = "BaiShiXiTong"
npc.bg = {} -- 改为存储控件对象的简单表
function npc.main()
local parent = GUI:Win_Create(npc.__cname, 0, 0, 0, 0, false, false, true, true, true, 0)
GUI:LoadExport(parent, "UI/BaoShiXiTongUI")
npc._parent = parent
npc.ui = GUI:ui_delegate(parent)
-- 使用正确的控件位置设置函数
-- ssrSetWidgetPosition 需要确认是否存在,如果不存在请使用 GUI:setPosition
-- GUI:setPosition(npc.ui.Image_1, 0, 0)
-- 入场动画(需要确认 Action_slow_appear 函数是否存在)
-- 如果不存在,可以使用以下替代方案:
-- GUI:setOpacity(npc._parent, 0)
-- GUI:runAction(npc._parent, GUI:ActionFadeTo(0.2, 1))
-- Action_slow_appear(npc._parent, 200, 3, 1)
GUI:addOnClickEvent(npc.ui.Button_1, function()
npc.Close()
end)
-- 初始化背景控件
for i = 1, 4 do
local bgName = "bg_" .. i
if npc.ui[bgName] then
npc.bg[i] = npc.ui[bgName]
GUI:setVisible(npc.bg[i], false)
end
end
npc.switch_interface(1)
end
function npc.switch_interface(id)
-- 先隐藏所有背景
for i = 1, 4 do
if npc.bg[i] and not GUI:Win_IsNull(npc.bg[i]) then
GUI:setVisible(npc.bg[i], false)
end
end
-- 显示当前选中的背景
if npc.bg[id] and not GUI:Win_IsNull(npc.bg[id]) then
GUI:setVisible(npc.bg[id], true)
-- 获取当前背景下的按钮并绑定事件
local bgUI = GUI:ui_delegate(npc.bg[id])
if bgUI and bgUI.ListView_1 then
local listViewUI = GUI:ui_delegate(bgUI.ListView_1)
-- 为每个按钮绑定切换事件
for i = 1, 4 do
local btnName = "Button_" .. i
if listViewUI[btnName] and not GUI:Win_IsNull(listViewUI[btnName]) then
-- 先移除可能已存在的事件,避免重复绑定
GUI:removeOnClickEvent(listViewUI[btnName])
GUI:addOnClickEvent(listViewUI[btnName], function()
npc.switch_interface(i)
end)
end
end
end
end
end
function npc.Close()
if GUI:Win_IsNotNull(npc._parent) then
GUI:Win_Close(npc._parent)
end
end
return npc
```
**修复要点:**
1. **简化数据结构:** `npc.bg` 现在只存储控件对象,不混合存储 `GUI:ui_delegate` 的结果
2. **添加控件有效性检查:** 使用 `GUI:Win_IsNull()` 确保操作前控件有效
3. **优化事件绑定:** 只在需要时获取 `GUI:ui_delegate`,避免重复绑定
4. **使用正确的关闭函数:** 使用 `GUI:Win_Close()` 而不是 `GUI:GetWindow()`
**注意事项:**
- 代码中的 `Action_slow_appear` 和 `ssrSetWidgetPosition` 函数需要确认是否存在
- 如果 `Action_slow_appear` 不存在,可以使用 `GUI:ActionFadeTo` 实现淡入效果
- 每次操作UI控件前都应该用 `GUI:Win_IsNull()` 检查有效性
下次写代码时要注意控件的生命周期管理,避免操作无效的控件对象。不懂的地方可以问浮生梦老师!