2010-07-09 47 views
0

我有一個使用基於自定義ImageCell項目渲染器的tilelist組件。我知道有時它的某些圖像試圖檢索將不會被發現,我可以通過自定義ImageCell加載器上的IEOrror偵聽器來處理它。但是,如果我設置了數據提供程序,那麼在所有圖像完成其加載或錯誤過程之前它被更改,Flash調試播放器在Firefox中拋出未處理的#2044錯誤,指出無法找到圖像。在使用調試播放器的歌劇中,它引發了一個#2044聲明負載從未完成。如何在更改dataprovider時處理來自Flash tilelist的未處理的#2044錯誤?

我無法找到一種方法來捕獲和忽略這些錯誤,因此他們不會拋出調試器播放器對話框。另外,使用Flash Builder IDE調試時,調試器根本不會中斷這些錯誤 - 只有在播放器中,我才能在沒有問題的情況下解決其他錯誤。

就好像錯誤監聽器在數據提供者發生變化時被丟棄,但加載器繼續並拋出未處理的#2044。

關於如何處理有效的任何想法?預先感謝您的時間和幫助 -

b

回答

2

在您的自定義單元格渲染器的構造函數,你需要一個事件偵聽器添加到受保護的裝載機實例和處理IO錯誤。

下面是一個例子:

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); 
     } 
    } 
} 

這裏是一個簡單的測試,我沒有看到,當數據提供商得到更新會發生什麼:

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

+0

我正是這樣做的。處理器在瓦片列表加載時捕獲IOErrors,但是如果我更改數據提供者,則會得到未處理的數據,就好像在數據提供者更改期間應該處理的加載器然後發送不再處理的IOErrorEvents,因爲加載器本身是不見了。 – WillyCornbread 2010-07-09 21:10:28

+0

@WillyCornbread這就是你所說的改變數據提供者的意思嗎?在我的小測試中,即使數據提供者改變了,行爲也是一樣的。 – 2010-07-10 12:27:10

+0

喬治 - 解決方案確實在你原來的答案。我將自己的IORErrorEvent處理程序添加到受保護的加載程序,但不覆蓋加載程序的受保護「handleErrorEvent」方法。一旦我使用了覆蓋,問題就停止了。非常感謝您的幫助。 – WillyCornbread 2010-07-10 19:45:06

相關問題