SL:release_print("打开装备回收界面")
local npc = {}
-- 装备分类总表:三大类 + 每类6小类
npc.equipCategory = {
[1] = {
title = "武器",
sub = {
[1] = { name = "刀剑类", list = { "木剑", "乌木剑", "铁剑", "青铜剑", "斩马剑", "短剑", "凝霜", "青铜斧", "七首", "井中月", "修
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-05-06 02:13:13 |
👁️ 阅读: 12
根据浮生梦老师前端课程内容,你的代码出现了"target is invalid cobj"错误,这通常是因为你尝试对不存在的控件对象进行操作。主要问题在于:
1. **控件对象获取错误**:`GUI:Button_Create()`返回的是控件对象,但你没有保存这个返回值
2. **通过`npc.ui[btn1]`访问不存在的控件**:`ui_delegate`只返回Export文件中定义的控件,动态创建的控件需要自己管理
**修复后的代码:**
```lua
SL:print("打开装备回收界面")
local npc = {}
-- 装备分类总表:三大类 + 每类6小类
npc.equipCategory = {
[1] = {
title = "武器",
sub = {
[1] = { name = "刀剑类", list = { "木剑", "乌木剑", "铁剑", "青铜剑", "斩马剑", "短剑", "凝霜", "青铜斧", "七首", "井中月", "修罗", "屠龙", "裁决", "凌风", "破山剑", "斩马刀", "八荒", "半月", "偃月", "魔杖", "无极棍", "骨玉权杖", "龙纹剑", "裁决之杖", "血饮", "霸者之刃", "嗜魂法杖", "逍遥扇", "龙牙利刃", "命运之刃" }},
[2] = { name = "法杖类", list = { "魔杖", "骨玉权杖", "龙纹剑", "裁决之杖", "血饮", "嗜魂法杖" }},
[3] = { name = "棍类", list = { "无极棍", "逍遥扇", "龙牙利刃" }},
[4] = { name = "刀类", list = { "斩马刀", "八荒", "半月", "井中月", "偃月" }},
[5] = { name = "斧类", list = { "青铜斧" }},
[6] = { name = "匕首类", list = { "七首", "短剑" }}
}
},
[2] = {
title = "防具",
sub = {
[1] = { name = "布衣类", list = { "布衣(男)", "布衣(女)", "轻型盔甲(男)", "轻型盔甲(女)", "中型盔甲(男)", "中型盔甲(女)", "重型盔甲(男)", "重型盔甲(女)", "魔法长袍(男)", "魔法长袍(女)", "灵魂战衣(男)", "灵魂战衣(女)", "战神盔甲(男)", "战神盔甲(女)", "幽灵战衣(男)", "幽灵战衣(女)", "恶魔长袍(男)", "恶魔长袍(女)", "天魔神甲", "圣战宝甲", "法神披风", "霓裳羽衣", "天尊道袍", "天师长袍", "上古神甲", "上古羽衣", "上古道袍", "上古披风", "上古法袍" }},
[2] = { name = "头盔类", list = { "青铜头盔", "铁头盔", "魔法头盔", "道士头盔", "战神头盔", "黑铁头盔", "天珠头盔", "铂金头盔", "天尊头盔", "圣战头盔", "法神头盔", "天魔头盔", "雷霆头盔", "光芒头盔", "烈焰头盔", "强化雷霆头盔", "强化光芒头盔", "强化烈焰头盔", "黄金头盔", "魔龙头盔", "圣龙盔", "天龙盔" }},
[3] = { name = "重甲类", list = { "重型盔甲(男)", "重型盔甲(女)", "战神盔甲(男)", "战神盔甲(女)", "天魔神甲", "圣战宝甲" }},
[4] = { name = "法袍类", list = { "魔法长袍(男)", "魔法长袍(女)", "恶魔长袍(男)", "恶魔长袍(女)", "法神披风", "霓裳羽衣" }},
[5] = { name = "道袍类", list = { "天尊道袍", "天师长袍", "上古道袍" }},
[6] = { name = "特殊防具", list = { "雷霆战甲(男)", "雷霆战甲(女)", "光芒道袍(男)", "光芒道袍(女)", "烈焰魔衣(男)", "烈焰魔衣(女)", "强化雷霆战甲", "强化光芒道袍", "强化烈焰魔衣" }}
}
},
[3] = {
title = "饰品",
sub = {
[1] = { name = "手镯类", list = { "铁手镯", "钢手镯", "皮制手套", "坚固手套", "死神手套", "幽灵手套", "阎罗手套", "力量手套", "天珠手套", "心灵手镯", "生命手镯", "思贝儿手镯", "恶魔铃铛", "龙之手镯", "紫碧螺", "黑檀手镯", "道士手镯", "坚固手套", "战神手镯", "圣魔手镯", "真魂手套", "强化雷霆手套", "强化光芒手套", "强化烈焰手套", "寂静之手", "寂静之手(战)", "寂静之手(法)", "寂静之手(道)", "太极手镯", "极光手套" }},
[2] = { name = "戒指类", list = { "玻璃戒指", "牛角戒指", "蓝色水晶戒指", "六角戒指", "生铁戒指", "金戒指", "魅力戒指", "道德戒指", "降妖除魔戒指", "黑色水晶戒指", "珊瑚戒指", "蛇眼戒指", "珍珠戒指", "骷髅戒指", "魔血戒指", "麻痹戒指", "复活戒指", "护身戒指", "防御戒指", "火焰戒指", "冰咆哮戒指", "极光戒指", "雷霆戒指", "光芒戒指", "烈焰戒指", "强化雷霆戒指", "强化光芒戒指", "强化烈焰戒指", "奔雷戒指", "狂雷戒指", "逆火戒指", "通云戒指", "镇神戒指", "真魂戒指" }},
[3] = { name = "项链类", list = { "金项链", "黄色水晶项链", "黑色水晶项链", "灯笼项链", "白色虎齿项链", "铂金项链", "传统项链", "魔鬼项链", "蓝翡翠项链", "琥珀项链", "放大镜", "凤凰明珠", "灵魂项链", "龙之戒指", "绿色项链", "骑士手镯", "力量戒指", "黑铁头盔", "天珠项链", "铂金项链", "灵魂项链", "泰坦戒指", "生命项链", "记忆项链", "雷霆项链", "光芒项链", "烈焰项链", "强化雷霆项链", "强化光芒项链", "强化烈焰项链", "奔雷项链", "狂雷项链", "逆火项链", "通云项链", "镇神项链", "真魂项链", "黄金项链", "魔龙项链", "圣龙项链", "天龙项链" }},
[4] = { name = "护腕类", list = { "铁手镯", "钢手镯", "黑檀手镯", "道士手镯", "坚固手套", "战神手镯" }},
[5] = { name = "勋章类", list = { "银星勋章", "银星勋章(战)", "银星勋章(法)", "银星勋章(道)" }},
[6] = { name = "特殊饰品", list = { "神秘戒指", "神秘腰带", "神秘头盔", "狂风戒指", "魔血戒指", "虹魔戒指", "麻痹戒指", "复活戒指", "护身戒指", "防御戒指" }}
}
}
}
local function networkCB(msgID, p1, p2, p3, msgData)
SL:print("===== 收到后端消息 =====")
SL:print("消息ID: " .. tostring(msgID))
SL:print("参数1: " .. tostring(p1))
SL:print("参数2: " .. tostring(p2))
SL:print("参数3: " .. tostring(p3))
SL:print("字符串: " .. tostring(msgData))
SL:print("=======================")
if msgID == 1021 and msgData == "装备回收" then
if p3 == 0 then
npc:openWin()
end
end
end
SL:RegisterLuaNetMsg(1021, networkCB)
function npc:openWin()
-- 创建外部界面
local win_recycleGUI = GUI:Win_Create("win_recycleGUI", 0, 0, 0, 0)
GUI:LoadExport(win_recycleGUI, "recycleGUI")
npc.ui = GUI:ui_delegate(win_recycleGUI)
GUI:addOnClickEvent(npc.ui.esc, function()
GUI:Win_Close(win_recycleGUI)
end)
-- 创建按钮并保存对象引用
npc.btnList = {} -- 存储动态创建的按钮对象
for k, v in ipairs(npc.equipCategory) do
local btn1 = "btn1_"..k
local yPos_1 = 404 - ((k-1)*35)
-- 保存按钮对象
npc.btnList[btn1] = GUI:Button_Create(npc.ui.ListView_first, btn1, 0, yPos_1, "res/01/010006.png")
-- 使用保存的对象进行操作
GUI:Button_loadTexturePressed(npc.btnList[btn1], "res/01/010005.png")
GUI:Button_setTitleText(npc.btnList[btn1], v.title)
GUI:addOnClickEvent(npc.btnList[btn1], function()
GUI:removeAllChildren(npc.ui.ListView_second)
for x, y in ipairs(v.sub) do
local btn2 = "btn2_"..k.."_"..x
local yPos_2 = 404 - ((x-1)*35)
-- 保存二级按钮对象
npc.btnList[btn2] = GUI:Button_Create(npc.ui.ListView_second, btn2, 0, yPos_2, "res/01/010006.png")
GUI:Button_loadTexturePressed(npc.btnList[btn2], "res/01/010005.png")
GUI:Button_setTitleText(npc.btnList[btn2], y.name)
GUI:addOnClickEvent(npc.btnList[btn2], function()
GUI:removeAllChildren(npc.ui.ScrollView_third)
for m, n in pairs(y.list) do
local imgBg = "Image_"..x.."_"..m
local chehkBox = "chehkBox_"..m
local text = "text"..m
local xPos_3 = 2 + 175 * ((m-1)%3)
local yPox_3 = 396 - 50 * math.floor((m-1)/3)
SL:print(xPos_3,"//",yPox_3,"//",n)
-- 保存图片对象
npc.btnList[imgBg] = GUI:Image_Create(npc.ui.ScrollView_third, imgBg, xPos_3, yPox_3, "res/public/1900000677.png")
GUI:setContentSize(npc.btnList[imgBg], 140, 40)
GUI:CheckBox_Create(npc.btnList[imgBg], chehkBox, 8, 6, "res/public/1900000550.png", "res/public/1900000551.png")
GUI:Text_Create(npc.btnList[imgBg], text, 40, 8, 16, "#FFFFFF", n)
end
end)
end
end)
end
end
```
**关键修改点:**
1. **添加了`npc.btnList = {}`**:用于存储动态创建的控件对象
2. **保存`GUI:Button_Create()`的返回值**:`npc.btnList[btn1] = GUI:Button_Create(...)`
3. **使用保存的对象进行操作**:`GUI:Button_loadTexturePressed(npc.btnList[btn1], ...)`
4. **同样处理了二级按钮和图片控件**
这样修改后,就不会出现"target is invalid cobj"错误了。记住:动态创建的控件对象必须自己管理,不能通过`npc.ui[控件名]`来访问。
← 返回问答库