[LUA-print] ----------------------------------------
[LUA-print] LUA ERROR: target is nil value
[LUA-print] stack traceback:
[string "scripts/GUI/GUI.lua"]:101: in function 'CheckIsInvalidCObject'
[string "scripts/GUI/GUI.lua"]:1563:
这个错误是因为在 `PlayerEquip.ShowDestiny()` 函数中,尝试给一个可能不存在的按钮添加点击事件导致的。
错误发生在第809行:
```lua
GUI:addOnClickEvent(btn, function()
```
**问题分析:**
1. 通过 `GUI:getChildByName(PlayerEquip._ui.destiny_list, "btn_"..k)` 获取按钮
2. 如果按钮不存在(返回nil),后续的 `GUI:addOnClickEvent` 就会报 "target is nil value" 错误
**解决方案:**
在第809行之前添加按钮存在性检查:
```lua
for k, v in ipairs(PlayerEquip.destiny_config) do
local btn = GUI:getChildByName(PlayerEquip._ui.destiny_list, "btn_"..k)
-- 添加按钮存在性检查
if GUI:Win_IsNull(btn) then
SL:Print("按钮 btn_"..k.." 不存在,跳过")
goto continue
end
if Lv < v.level or rLv < v.rlv then
GUI:Button_setBright(btn, false)
end
if Lv >= v.level and rLv >= v.rlv then
local width, height = SL:GetMetaValue("SCREEN_WIDTH"), SL:GetMetaValue("SCREEN_HEIGHT")
GUI:Button_setBright(btn, true)
GUI:addOnClickEvent(btn, function()
-- 检查是否已创建该Layout
local layoutKey = "Layout_"..k
local Layout_Win = PlayerEquip._destinyLayouts[layoutKey]
if Layout_Win and not GUI:Win_IsNull(Layout_Win) then
-- 如果Layout存在且被隐藏,则显示出来
if not GUI:getVisible(Layout_Win) then
GUI:setVisible(Layout_Win, true)
end
return
end
-- 创建新的Layout
Layout_Win = GUI:Layout_Create(PlayerEquip._ui.Node_1, layoutKey, -654, -243, width, height, true)
GUI:Layout_setBackGroundColorType(Layout_Win, 1)
GUI:Layout_setBackGroundColor(Layout_Win, "#000000")
GUI:Layout_setBackGroundColorOpacity(Layout_Win, 200)
GUI:setLocalZOrder(Layout_Win, 100)
GUI:setTouchEnabled(Layout_Win, true)
GUI:setMouseEnabled(Layout_Win, true)
-- 存储到缓存中
PlayerEquip._destinyLayouts[layoutKey] = Layout_Win
for i = 1, 3 do
local imageName = "destiny_img"..k.."_"..i
local x = 100 * (i - 1) * 150
local img = GUI:Image_Create(Layout_Win, imageName, 100, 100, "res/private/player_main_layer_ui/player_main_layer_ui_win32/1900015001_1.jpg")
end
local text = GUI:Text_Create(Layout_Win, "text_1_"..k, 150, 100, 18, "#f000ff", k)
local btn_hold = GUI:Button_Create(Layout_Win, "btnhold_"..k, 300, 100, "res/public_win32/anniu11_2.png")
GUI:Button_setTitleText(btn_hold, "暂时挂起")
GUI:Button_setTitleColor(btn_hold, "#ff0000")
GUI:Button_setTitleFontSize(btn_hold, 18)
GUI:addOnClickEvent(btn_hold, function()
GUI:setVisible(Layout_Win, false)
end)
end)
end
::continue::
end
```
**关键修改:**
1. 使用 `GUI:Win_IsNull(btn)` 检查按钮是否存在
2. 如果按钮为nil,使用 `goto continue` 跳过当前循环
3. 添加了调试信息输出,便于定位问题
**调试建议:**
在修改前可以先添加调试代码,查看哪些按钮不存在:
```lua
for k, v in ipairs(PlayerEquip.destiny_config) do
local btn = GUI:getChildByName(PlayerEquip._ui.destiny_list, "btn_"..k)
if GUI:Win_IsNull(btn) then
SL:Print("警告:按钮 btn_"..k.." 在 destiny_list 中不存在")
end
-- ... 其他代码
end
```
这种错误通常是因为UI布局文件中没有对应的按钮控件,或者控件名称不匹配导致的。下次遇到类似问题,记得先检查控件是否存在再操作!不懂的可以问浮生梦尊师!