Ошибка TrenList itemrenderer: метод, отмеченный как override, должен переопределить другой метод - PullRequest
1 голос
/ 05 августа 2011
    <mx:TileList id="tl" allowMultipleSelection="true">             
     <mx:itemRenderer>
       <mx:Component>                       
         <mx:VBox height="100%"width="100%" borderSides="borderStyle="solid">
           <mx:Text id="txt1" text="{getText(XML(data))}" selectable="{_selectable}" />
            <mx:Script>
        <![CDATA[
        import mx.controls.listClasses.IListItemRenderer;

            public override function  set data(obj:Object):void{
            //this override function works alright 
            }   

          private function getText(data:XML):String{
          // some logic inside this function. Works fine. 
          }


    override protected function drawSelectionIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void{
        //this function gives me compile error - "Method marked override must override another method"                          }


           ]]>
        </mx:Script>
        </mx:VBox>
      </mx:Component>
    </mx:itemRenderer>
    </mx:TileList>

Теперь я знаю, что мог бы создать другой класс, расширить список плиток и переопределить этот метод там, и он будет работать нормально, потому что он найдет метод, который будет переопределен в области видимости суперкласса. Но я на самом деле хочу сделать это встроенным на уровне компонента (я не хочу создавать другой файл, каждый раз, когда мне нужно делать небольшие изменения в списке листов, сетке данных и т. Д.).

-------------------------- ПОЛНЫЙ КОД Прототип (без логики функций) ---------

    <mx:VBox horizontalAlign="center" verticalAlign="middle"> 
    <mx:HorizontalList id="headerList" width="100%" columnCount="7" paddingBottom="0" selectable="false" columnWidth="98" rowHeight="40">
    <mx:dataProvider>
                        <mx:Array>
                        <mx:String>Sunday</mx:String>
                        <mx:String>Monday</mx:String>
                        <mx:String>Tuesday</mx:String>
                        <mx:String>Wednesday</mx:String>
                        <mx:String>Thursday</mx:String>
                        <mx:String>Friday</mx:String>
                        <mx:String>Saturday</mx:String>
                        </mx:Array>
      </mx:dataProvider>
 <mx:itemRenderer>
<mx:Component>
<mx:VBox backgroundAlpha="0.8" height="100%" width="100%" horizontalAlign="center" paddingTop="0" verticalAlign="middle" borderSides="bottom left right" borderStyle="solid">
                            <mx:Label text="{data}" fontWeight="bold"/>
                        </mx:VBox>
                    </mx:Component>
                </mx:itemRenderer>
                </mx:HorizontalList>
                <mx:TileList id="tl" allowMultipleSelection="true" mouseOver="tl.setStyle('backgroundColor','0xFFFFFF')" paddingTop="0" height="100%" width="100%" borderSides="none"  dataProvider="{IndividualData.w.s}" maxRows="4" maxColumns="7" columnCount="7" rowCount="4" rowHeight="110" columnWidth="98">                
                 <mx:Script>
                    <![CDATA[
                        import mx.controls.listClasses.IListItemRenderer;
                        protected override function drawSelectionIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void{
                           return;             
                       }
                   ]]>
                </mx:Script>
                 <mx:itemRenderer>
                    <mx:Component>                      
                        <mx:VBox height="100%" horizontalAlign="center" width="100%" borderSides=" top bottom left right" borderStyle="solid"
                            click="outerDocument.onItemClick(event,XML(data));onEdit()" doubleClickEnabled="true" doubleClick="onScheduleDetail(data.@date)"  
                            verticalAlign="middle" mouseOver="onMouseOver()" mouseOut="onMouseOut()"
                            backgroundColor="{_bgColor}">
                            <mx:Text id="txt1" text="{getText(XML(data))}" selectable="{_selectable}" />
                            <mx:Script>
                            <![CDATA[
                                import mx.controls.listClasses.IListItemRenderer;
                                import mx.core.UIComponent;
                                import com.smartLinx.utils.DateUtils;
                                import com.smartLinx.utils.Helper;
                                import com.smartLinx.utils.DateUtils;
                                import com.smartLinx.ScheduleOptimizer.components.ScheduleDetail;
                                import mx.managers.PopUpManager;
                                [Bindable] private var _bgAlpha:Number;
                                [Bindable] private var _selectable:Boolean;
                                [Bindable] private var _bgColor:uint;       
                                [Bindable] private var _pastDated:Boolean;      

                                /* override protected function drawSelectionIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void
                                {
                                      return;
                                }  */
                                private function getText(data:XML):String
                                    {
                                     //                                 }

                                   private function onMouseOver():void{
                                      }

                                   private function onMouseOut():void{

                                      }  

                                   private function onEdit():void{
                                   }   

                                    public override function  set data(obj:Object):void
                                    {

                                        super.data = obj;                                   
                                    }                                   

                                private function onScheduleDetail(work_date:String):void
                                {
                                }
                                ]]>
                            </mx:Script>
                        </mx:VBox>
                    </mx:Component>
                </mx:itemRenderer>

                </mx:TileList>
            </mx:VBox>  
        </mx:VBox>

1 Ответ

2 голосов
/ 05 августа 2011

Попробуйте это:

<mx:TileList id="tl" allowMultipleSelection="true">             
        <mx:Script>
    <![CDATA[
    import mx.controls.listClasses.IListItemRenderer;
override protected function drawSelectionIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void{
    //this function gives me compile error - "Method marked override must override another method"                          }


       ]]>
    </mx:Script>
 <mx:itemRenderer>
   <mx:Component>                       
     <mx:VBox height="100%"width="100%" borderSides="borderStyle="solid">
       <mx:Text id="txt1" text="{getText(XML(data))}" selectable="{_selectable}" />
        <mx:Script>
    <![CDATA[
        public override function  set data(obj:Object):void{
        //this override function works alright 
        }   
       ]]>
    </mx:Script>
    </mx:VBox>
  </mx:Component>
</mx:itemRenderer>
</mx:TileList>

В вашем случае вы пытаетесь переопределить метод VBox, который отсутствует.

Отредактировано после расширения поста:

Правило № 1 гибкости, которому я всегда следую:

Избегайте встроенных компонентов MXML.

Встроенные компоненты повышают сложность и снижают читаемость. Его можно использовать только в случае быстрого прототипирования (просто разметка без кода), когда вы точно знаете, что делаете. Так что для этого нужны богатые практические навыки.

Но в вашем коде есть как минимум три симптома, чтобы избежать встроенных компонентов:

  1. Имеет более одного встроенного компонента.
  2. Имеется код ActionScript для встроенных компонентов.
  3. Весь класс MXML довольно большой и сложный для чтения.

Итак, я предлагаю вам две вещи:

  1. Избавьтесь от встроенных компонентов в вашем текущем коде. Извлечение компонентов в отдельные классы MXML.
  2. Не используйте их больше. Когда у вас будет достаточно навыков, вы можете разумно нарушить это правило:)
...