SL:print("打开镖局界面")
local npc = {}
local selectEscortCart = nil
local function networkCB(msgID, p1, p2, p3, msgData)
SL:print("===== 收到后端消息 =====")
SL:print("消息ID: " .. tostring(msgID))
SL:print("参数1: " .. tostring(p1))
SL:print("
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-07-02 17:57:16 |
👁️ 阅读: 4
根据浮生梦老师前端课程内容,这个错误是因为在 `selectEscortCart` 为 `nil` 时,你仍然尝试使用 `GUI:getName(selectEscortCart)` 获取名字,导致传入了一个无效的控件对象。
**问题分析:**
1. 在 `npc:openWin(p3)` 函数中,当 `selectEscortCart` 为 `nil` 时,你执行了 else 分支
2. 在 else 分支中直接调用了 `GUI:getName(selectEscortCart)`,此时 `selectEscortCart` 是 `nil`
3. `GUI:getName()` 函数要求传入有效的控件对象,传入 `nil` 会导致 "target is invalid cobj" 错误
**修正方案:**
在调用 `GUI:getName()` 之前,先检查 `selectEscortCart` 是否为有效控件:
```lua
function npc:openWin(p3)
local width, height = SL:GetMetaValue("SCREEN_WIDTH"), SL:GetMetaValue("SCREEN_HEIGHT")
local win_bc = GUI:Win_Create("win_bc", 0, 0, width, height)
local mobile, pc = SL:GetMetaValue("PLATFORM_MOBILE"), SL:GetMetaValue("PLATFORM_WINDOWS")
if pc then
local win_bc_1 = GUI:Node_Create(win_bc,"Win_item_k_1", width/2,height/2)
GUI:LoadExport(win_bc_1, "playernpc/escortGoods")
end
if mobile then
local win_bc_1 = GUI:Node_Create(win_bc,"Win_item_k_1", width/2,(height/2 + 20))
GUI:LoadExport(win_bc_1, "playernpc/escortGoods")
end
npc.ui = GUI:ui_delegate(win_bc)
GUI:addOnClickEvent(npc.ui.esc, function()
GUI:Win_Close(win_bc)
end)
-- 刷新点亮镖车
GUI:Text_setString(npc.ui.cost_test, tostring(p3))
if not selectEscortCart then
selectEscortCart = npc.ui.ImageEscortCart_1
GUI:setVisible(npc.ui.ImageEscortCart_1, true)
else
-- 先检查控件是否有效
if selectEscortCart and not GUI:Win_IsNull(selectEscortCart) then
local name = GUI:getName(selectEscortCart)
SL:Print("控件名字:", name)
else
SL:Print("selectEscortCart 控件无效或为空")
end
end
-- 刷新镖车
GUI:addOnClickEvent(npc.ui.btn_refresh, function()
SL:SendLuaNetMsg(2031, 31, 1, 0, "龙门镖局")
end)
-- 确认镖车
GUI:addOnClickEvent(npc.ui.btn_sure, function()
SL:SendLuaNetMsg(2031, 31, 2, 0, "龙门镖局")
end)
end
```
**修改说明:**
1. 在 else 分支中添加了有效性检查:`if selectEscortCart and not GUI:Win_IsNull(selectEscortCart) then`
2. 使用 `GUI:Win_IsNull()` 函数检查控件是否为空(这是996引擎推荐的检查方式)
3. 只有当控件有效时才调用 `GUI:getName()` 获取名字
**建议:**
下次写代码时,记得在使用任何控件对象前先进行有效性检查,避免出现这种空对象错误。如果还有不明白的地方,可以随时问浮生梦老师!
← 返回问答库