You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

魔兽世界插件开发求助:添加按钮点击后列表无法显示

解决魔兽世界插件列表显示问题

你的代码仅完成了数据存储逻辑,没有创建对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:40:36