尝试索引字段' text' (零值)

时间:2018-04-28 17:57:15

标签: lua world-of-warcraft

我在插件开发/

期间在我的wow客户端收到以下错误
83x FrameXML\OptionsFrameTemplates.lua:157: attempt to index field 
'text' (a nil value)
FrameXML\OptionsFrameTemplates.lua:157: in function <FrameXML\OptionsFrameTemplates.lua:156>

Locals:
self = ShiftDropDown_Button {
 0 = <userdata>
 toggle = ShiftDropDown_ButtonToggle {
 }
}
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = "attempt to index field 'text' (a nil value)"

我用这个

在XML文件中调用它
        <Button name="ShiftDropDown_Button" inherits="InterfaceOptionsListButtonTemplate" text="Select Target">
            <Size>
                <AbsDimension x="150" y="10" />
            </Size>
            <Anchors>
                <Anchor point="TOPLEFT">
                    <Offset x="189" y="-115" />
                </Anchor>
            </Anchors>
            <Scripts>
                <OnLoad>
                    ShiftDropDown_Button_OnLoad(self)
                </OnLoad>
                <OnClick>
                    ShiftDropDownFrame:Show()
                </OnClick>
            </Scripts>

并且Lua中的函数在这里

function ShiftDropDown_Button_OnLoad(self)
    self:RegisterEvent('ADDON_LOADED')
    self:SetScript('OnEvent', function(self, event, ...)
        if event == 'ADDON_LOADED' and ... == 'TauntMasterReborn' then
            TauntMasterRebornDB = TauntMasterRebornDB or {}
            for option, value in pairs(TauntM_defaults) do
                if not TauntMasterRebornDB[option] then TauntMasterRebornDB[option] = value end
            end
            self:SetText(TauntMasterRebornDBChar.SHIFTTARGET1)
        end
    end)
end

有人可以解释为什么会抛出这个错误吗?我搜索了很多例子,找不到调试方法或解决问题的方法。

1 个答案:

答案 0 :(得分:4)

您的按钮继承自InterfaceOptionsListButtonTemplate,而该按钮最初继承自OptionsListButtonTemplate

此模板具有按钮文字:

<ButtonText name="$parentText" justifyH="LEFT" wordwrap="false"/>

以下是发生错误的代码:

function OptionsListButton_OnEnter (self)
  if (self.text:IsTruncated()) then
    GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
    GameTooltip:SetText(self:GetText(), NORMAL_FONT_COLOR[1], NORMAL_FONT_COLOR[2], NORMAL_FONT_COLOR[3], 1, true);
  end
end

它尝试通过使用self使用按钮文本的属性值-在这种情况下为self.text-。 text parentKey不是在xml文件中分配的,而是在OnLoad中分配的 功能,该功能已被您覆盖。

要修复模板,您必须扩展ShiftDropDown_Button_OnLoad函数:

function ShiftDropDown_Button_OnLoad(self)
    self.text = _G[self:GetName() .. "Text"];
    self.highlight = self:GetHighlightTexture();

    self:RegisterEvent('ADDON_LOADED')
    self:SetScript('OnEvent', function(self, event, ...)
        if event == 'ADDON_LOADED' and ... == 'TauntMasterReborn' then
            TauntMasterRebornDB = TauntMasterRebornDB or {}
            for option, value in pairs(TauntM_defaults) do
                if not TauntMasterRebornDB[option] then TauntMasterRebornDB[option] = value end
            end
            self:SetText(TauntMasterRebornDBChar.SHIFTTARGET1)
        end
    end)
end