0

当我运行我的 Flex 2 应用程序时,我收到以下运行时错误:

TypeError: 错误 #1009: No se puede acceder a una propiedad oa un método de una referencia a un objeto nulo。

换句话说,Flex SDK 告诉我 ItemRenderer 中的“lb”变量为空(我用调试器检查过,是的,它确实为空)我做错了什么?

触发错误的行是这一行: lb.text=value.spe_name;

我的瓷砖列表:

<mx:TileList variableRowHeight="true" liveScrolling="false" width="100%" textAlign="left"     height="100%" columnCount="2"  dataProvider="{model.specialfield_issue_list}" itemRenderer="org.nevis.cairngorm.mod.view.IRCampoEspecial" direction="horizontal"></mx:TileList>

我的 ItemRenderer 简化了源代码:

<?xml version="1.0"?>
    <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
        horizontalAlign="left" verticalAlign="middle"
        verticalGap="0" borderStyle="none" width="100%" height="100%"
     horizontalScrollPolicy="off" verticalScrollPolicy="off" toolTip=""  creationPolicy="all"   
     >

        <mx:Script>
            <![CDATA[
            import mx.controls.TextArea;
            import mx.controls.Text;
            import org.nevis.cairngorm.mod.model.ModelLocator;
            import mx.core.UIComponent;
            import mx.controls.Label;
            import mx.controls.ComboBox;
            import mx.controls.TextInput;
            import utils.Utils;
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;

            [Bindable]
            public var model:ModelLocator=ModelLocator.getInstance();

            [Bindable]
            private var fieldLabelVisible:Boolean = false;

            [Bindable]
            private var textInputVisible:Boolean = false;

            [Bindable]
            private var textAreaVisible:Boolean = false;

            [Bindable]
            private var comboBoxVisible:Boolean = false;

            [Bindable]
            private var mandatoryLabelVisible:Boolean = false;


            public function updata_valor_text(valor:Event):void {
                data.value=valor.currentTarget.text;
            }

            public function updata_valor_combo(valor:Event):void {
                data.value=valor.currentTarget.selectedItem.valuesspecialfieldid
            }

            override public function set data(value:Object):void {
              var i:int;
              var sel:int;

              if (value){   

                super.data = value;

                fieldLabelVisible = true;
                lb.text=value.spe_name;
                lb.toolTip=value.spe_description;
                lb.width=150;  
                lb.name='etiqueta'; 
                lb.styleName='texto-iza';

              } else {
                  fieldLabelVisible = false;
                  textInputVisible = false;
                  textAreaVisible = false;
                  comboBoxVisible = false;
                  mandatoryLabelVisible = false;
              }
            } 

            ]]>
        </mx:Script>

        <mx:Label id="lb" visible="{fieldLabelVisible}" includeInLayout="{fieldLabelVisible}"/> 
        <mx:TextInput id="ti" visible="{textInputVisible}" includeInLayout="{textInputVisible}"/>
        <mx:TextArea id="ta" visible="{textAreaVisible}" includeInLayout="{textAreaVisible}"/>
        <mx:ComboBox id="cb" visible="{comboBoxVisible}" includeInLayout="{comboBoxVisible}"/>
        <mx:Label id="mandatory" visible="{mandatoryLabelVisible}" includeInLayout="{mandatoryLabelVisible}"/>
    </mx:HBox>

我不确定,但我认为我使用的 SDK 是 2.0.1 Hotfix 3。

谢谢你的帮助!

4

1 回答 1

0

我已经找到了解决方案。我的代码中发生的情况是,当我尝试访问我的 mx 组件(Label、TextInput、TextArea 等)时​​,它们还没有被创建。为了解决这个问题,我使用了 callLater 函数,如下所示:

override public function set data(value:Object):void {
              var i:int;
              var sel:int;

              super.data = value;

              callLater(function onceAllCreated():void{              

              if (value){   

                fieldLabelVisible = true;
                lb.text=value.spe_name;
                lb.toolTip=value.spe_description;
                lb.width=150;  
                lb.name='etiqueta'; 
                lb.styleName='texto-iza';

              } else {
                  fieldLabelVisible = false;
                  textInputVisible = false;
                  textAreaVisible = false;
                  comboBoxVisible = false;
                  mandatoryLabelVisible = false;
              }

              });
            }

希望这对其他人有帮助!

于 2012-01-19T15:03:32.947 回答