Domanda

Ho un componente tilelist utilizzando un rendyer Renderer Based ImageCell personalizzato. So che a volte alcune delle immagini sta cercando di recuperare non saranno trovate e sono in grado di gestirlo tramite un ascoltatore di ieorrore sul caricatore ImageCell personalizzato.

Tuttavia, se impostare il fornitore di dati, viene modificato prima che tutte le immagini abbiano completato il loro caricamento o processo di errore, il giocatore di debug flash genera un errore non gestito # 2044 in Firefox affermando che un'immagine non è stata trovata. In Opera con il giocatore di debug Getta un # 2044 affermando che un carico non è mai stato completato.

Non riesco a trovare un modo per intrappolare e ignorare questi errori in modo che non lanciano il dialogo del giocatore di debugger. Inoltre, quando si utilizza il Builder Flash IDE per eseguire il debug, il debugger non si interrompe su questi errori - è solo nel giocatore mentre sono in grado di rompere altri errori senza problemi.

È come se il listener di errore venga smaltito quando il DataProvider cambia, ma il caricatore continua e lancia un # 2044.

Qualche idea su come gestire l'efficacia? Grazie in anticipo per il tuo tempo e assistenza -

B

È stato utile?

Soluzione

Nel costruttore del tuo rendering cellulare personalizzato, è necessario aggiungere un listener di eventi al caricatore PADEER protetto e gestire l'IoError.

Ecco un esempio:

package
{
    import fl.controls.listClasses.ICellRenderer;
    import fl.controls.listClasses.ImageCell;
    import fl.controls.TileList;
    import fl.data.DataProvider;
    import fl.managers.StyleManager;
    import flash.events.EventDispatcher;
    import flash.events.*;
    import fl.containers.UILoader;

    public class CustomImageCell extends ImageCell implements ICellRenderer
    {  

        public function CustomImageCell() 
        {
            super();

            //do other stuff here

            loader.scaleContent = false;
            loader.addEventListener(IOErrorEvent.IO_ERROR, handleErrorEvent, false, 0, true);

            useHandCursor = true;
        }

        override protected function drawLayout():void
        {
            var imagePadding:Number = getStyleValue("imagePadding") as Number;
            loader.move(11, 5);

            var w:Number = width-(imagePadding*2);
            var h:Number = height-imagePadding*2;
            if (loader.width != w && loader.height != h)
            {
                loader.setSize(w,h);
            }
            loader.drawNow(); // Force validation!

        }
        override protected function handleErrorEvent(event:IOErrorEvent):void {
            trace('ioError: ' + event);
            //dispatchEvent(event);
        }
    }
}
.

Ecco un semplice test che ho visto per vedere cosa succede quando il fornitore di dati viene aggiornato:

import fl.controls.*;
import fl.data.DataProvider;
import fl.controls.listClasses.CellRenderer;

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

var tileList:TileList = new TileList ();
tileList.move(220,40);
tileList.setSize(215, 400);
tileList.columnWidth = 215;
tileList.rowHeight = 86;
tileList.direction = ScrollBarDirection.VERTICAL;
tileList.setStyle("cellRenderer", CustomImageCell);
addChild(tileList);

tileList.dataProvider = getRandomDP(10);
setTimeout(resetDP,3000);

function resetDP():void {
    tileList.dataProvider = getRandomDP(10);
}
function getRandomDP(size:int):DataProvider {
    var result:DataProvider = new DataProvider();
    for(var i:int = 0; i < size; i++)   result.addItem({label:'item'+i,source:'wrong.url/'+Math.random()});
    return result;
}
.

HTH

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top