魔兽世界插件开发求助:添加按钮点击后列表无法显示
解决魔兽世界插件列表显示问题
你的代码仅完成了数据存储逻辑,没有创建对应的UI元素渲染列表内容,所以无法在窗口中看到添加的项。以下是具体的解决方案:
1. 先创建列表容器
在你的UI窗口初始化代码中,添加一个容器Frame用来承载所有列表项:
-- 创建列表容器,放置在窗口下方区域 PIConfig.listContainer = CreateFrame("Frame", nil, PIConfig) PIConfig.listContainer:SetPoint("TOPLEFT", PIConfig, "TOPLEFT", 20, -100) -- 可根据你的UI布局调整位置 PIConfig.listContainer:SetSize(PIConfig:GetWidth() - 40, PIConfig:GetHeight() - 150) -- 自适应窗口尺寸
2. 编写列表项创建函数
这个函数负责生成单个列表项的UI,包含物品ID/名称显示文本和右侧输入框:
local function CreateListItem(itemId, parent) -- 创建列表项的容器Frame local itemFrame = CreateFrame("Frame", nil, parent) itemFrame:SetSize(parent:GetWidth(), 30) -- 垂直排列列表项,每个项间隔30像素 itemFrame:SetPoint("TOP", parent, "TOP", 0, -30 * (#parent:GetChildren())) -- 显示物品ID/名称的文本控件 local itemText = itemFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal") itemText:SetPoint("LEFT", itemFrame, "LEFT", 5, 0) itemText:SetText(itemId) -- 先显示ID,物品数据加载后更新为名称 -- 处理GetItemInfo异步加载问题 local function UpdateItemName() local itemName = GetItemInfo(itemId) if itemName then itemText:SetText(itemName .. " (" .. itemId .. ")") else -- 未加载到数据则1秒后重试 C_Timer.After(1, UpdateItemName) end end UpdateItemName() -- 创建右侧空白输入框 local inputBox = CreateFrame("EditBox", nil, itemFrame, "InputBoxTemplate") inputBox:SetSize(80, 25) inputBox:SetPoint("RIGHT", itemFrame, "RIGHT", -5, 0) inputBox:SetNumeric(true) -- 限制仅输入数字 inputBox:SetText(PerItList[itemId].num1 or 0) -- 从存档读取初始值 -- 输入框值变更时同步到SavedVariable inputBox:SetScript("OnEnterPressed", function(self) self:ClearFocus() PerItList[itemId].num1 = tonumber(self:GetText()) or 0 end) inputBox:SetScript("OnEditFocusLost", function(self) PerItList[itemId].num1 = tonumber(self:GetText()) or 0 end) return itemFrame end
3. 修改添加按钮的点击事件
优化原有逻辑,避免重复添加,并调用列表项创建函数生成UI:
PIConfig.addBtn:SetScript("OnClick", function(self, button, down) local inputNum = InputBox10:GetNumber() if inputNum == 0 then -- 过滤无效输入 return end -- 避免重复添加相同物品ID if not PerItList[inputNum] then table.insert(perList, inputNum) PerItList[inputNum] = { ["itemName"] = GetItemInfo(inputNum) or "", ["num1"] = 0, ["num2"] = 0 } -- 创建并添加新的列表项到容器 CreateListItem(inputNum, PIConfig.listContainer) end end)
4. 插件加载时初始化已有列表
在插件加载事件中,读取SavedVariable并渲染已保存的列表项:
local function OnAddonLoaded(_, addonName) if addonName ~= "你的插件名称" then -- 替换为你的插件实际名称 return end -- 初始化存档变量(首次加载时创建默认值) perList = perList or {} PerItList = PerItList or {} -- 渲染已保存的列表项 for _, itemId in ipairs(perList) do if PerItList[itemId] then CreateListItem(itemId, PIConfig.listContainer) end end end RegisterEvent("ADDON_LOADED", OnAddonLoaded)
注意事项
- 所有变量尽量声明为局部变量,避免全局污染(比如原代码中的
itemNum应改为local itemNum)。 - 如果需要支持更多输入框(比如
num2),可以在CreateListItem函数中添加第二个输入框,逻辑和第一个一致。 - 若列表项数量较多,建议改用
ScrollFrame替代普通Frame,实现滚动查看功能。
内容的提问来源于stack exchange,提问作者Ransax
相关产品推荐
相关产品推荐

