报错[LUA-print] [16:49:23-687] ----------------------------------------
[LUA-print] [16:49:23-687] LUA ERROR: target is nil value
[LUA-print] [16:49:23-687] stack traceback:
[string "scripts/GUI/GUI.lua"]: in function ''
[string "script
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-17 16:50:33 |
👁️ 阅读: 14
从报错信息来看,错误发生在第49行调用 `GUI:LoadingBar_setPercent(LoadingBar_1, index)` 的时候,提示 `target is nil value`。这说明 `LoadingBar_1` 这个控件对象是 `nil`,导致函数调用失败。
让我们分析一下你的代码,问题出在以下几个地方:
1. **创建进度条的逻辑有误**:
```lua
if ui.LoadingBar_1 then
UILib:removeFromParent(ui.LoadingBar_1)
end
local LoadingBar_1 = GUI:LoadingBar_Create(ui.Image_2, "LoadingBar_1", 15, 3, "res/custom/yuanshenchuqiao/3.png", 0)
```
你创建了一个**局部变量** `LoadingBar_1`,但是后面又用 `ui.LoadingBar_1` 去判断和移除。这导致 `ui.LoadingBar_1` 这个成员变量始终没有被赋值,一直是 `nil`。所以当你执行到 `GUI:LoadingBar_setPercent(LoadingBar_1, index)` 时,这个局部变量 `LoadingBar_1` 很可能因为创建失败或其他原因,也是 `nil`。
2. **创建进度条后没有赋值给成员变量**:
创建成功后,你需要将控件对象保存起来,以便后续使用。按照浮生梦老师前端课程中的常见做法,应该赋值给 `ui.LoadingBar_1`。
**修改后的 `updateUI` 函数中关于进度条的部分应该如下:**
```lua
function YuanShenChuQiao:updateUI(data)
local ui = self.ui
local index = 0
if data then
index = data
end
-- ... 其他代码 ...
--进度条显示
-- 先移除旧的进度条(如果存在)
if ui.LoadingBar_1 and not GUI:Win_IsNull(ui.LoadingBar_1) then
GUI:removeFromParent(ui.LoadingBar_1)
end
-- 创建新的进度条,并赋值给成员变量
ui.LoadingBar_1 = GUI:LoadingBar_Create(ui.Image_2, "LoadingBar_1", 15, 3, "res/custom/yuanshenchuqiao/3.png", 0)
-- 设置进度
GUI:LoadingBar_setPercent(ui.LoadingBar_1, index)
-- ... 按钮事件等其他代码 ...
end
```
**主要修改点:**
1. 将创建进度条的结果直接赋值给 `ui.LoadingBar_1`,而不是一个局部变量。
2. 在移除旧控件前,使用 `GUI:Win_IsNull` 检查控件是否有效,这是更安全的做法。
3. 后续设置进度时,直接使用 `ui.LoadingBar_1`。
这样修改后,`ui.LoadingBar_1` 在创建成功后就是一个有效的控件对象,再调用 `GUI:LoadingBar_setPercent` 就不会出现 `target is nil` 的错误了。
下次写代码时要注意区分局部变量和成员变量哦,不懂的可以随时问我!
← 返回问答库