0

사용자 정의 ImageCell 기반 항목 렌더러를 사용하는 tilelist 구성 요소가 있습니다. 때로는 검색하려고하는 이미지 중 일부가 발견되지 않으며 맞춤 ImageCell 로더의 IEOrror 리스너를 통해이를 처리 할 수 ​​있다는 것을 알고 있습니다.dataprovider를 변경할 때 플래시 tilelist에서 처리되지 않은 # 2044 오류를 처리하는 방법은 무엇입니까?

그러나 데이터 공급자를 설정하면 모든 이미지가로드 또는 오류 프로세스를 완료하기 전에 변경됩니다. 플래시 디버그 플레이어는 이미지를 찾을 수 없다는 Firefox의 처리되지 않은 # 2044 오류를 발생시킵니다. 디버그 플레이어가있는 오페라에서는로드가 완료되지 않았 음을 나타내는 # 2044를 반환합니다.

이러한 오류를 잡아 내고 무시하는 방법을 찾을 수 없으므로 디버거 플레이어 대화를 표시하지 않습니다. 또한 Flash Builder IDE를 사용하여 디버깅 할 때 디버거가 이러한 오류를 전혀 중단하지 않습니다. 문제가없는 다른 오류를 해결할 수있는 동안 플레이어에서만 발생합니다.

dataprovider가 변경 될 때 오류 수신기가 삭제되는 것처럼 보이지만 로더는 처리되지 않고 # 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를 포획합니다. 그러나 dataprovider를 변경하면 처리되지 않은 로더가 dataprovider 변경 중에 처리되었으므로 더 이상 처리되지 않는 IOErrorEvent를 처리하는 것처럼 처리되지 않습니다. 지나간. – WillyCornbread

+0

@WillyCornbread 당신은 데이터 제공자를 변경함으로써 그것이 무엇을 의미합니까? 내 작은 테스트에서 데이터 공급자가 변경 되더라도 동작은 동일합니다. –

+0

George - 해결책은 실제로 원래 답변이었습니다. 내 자신의 IORErrorEvent 처리기를 보호 된 로더에 추가하고 있지만 로더의 보호 된 'handleErrorEvent'메서드를 재정의하지 않았습니다. 일단 오버라이드를 사용하면 문제가 멈 춥니 다. 도움을 많이 주셔서 감사합니다. – WillyCornbread