2011-11-09 2 views
0

ツリーインスタンスにiconFunction "getIconFromItem"を呼び出しています。ActionScript:ビットマップをクラスに正しくキャストする

<mx:Tree dataProvider="{collection}" iconFunction="getIconFromItem" /> 

getIconFromItem関数は、ビットマップがnullではない場合でもnullを返します。

public function getIconFromItem(item:Object):Class { 
    var result:Class = item.icon as Class ; 
    return result ; 
} 

戻り値の結果行にブレークポイントを設定すると、item.iconはビットマップであり、結果はnullであることがわかります。

ビットマップがアイコンとして返されるようにビットマップをクラスとしてキャストする方法に関するアイデアやポインターはありますか?

乾杯

キース

答えて

3

ここでの問題はなく、Objectから、item.iconはタイプClassから拡張されていないタイプBitmapのものであるということです。オブジェクトの型階層にない型にキャストするたびに、nullが返されます。

はあなたが

public function getIconFromItem(item:Object):Class { 
    return item.icon.constructor as Class; 
} 
+0

nullが返される理由についての説明をありがとう!あなたの提案は別のエラーを引き起こします。 _1084:構文エラー:クラスの前に識別子が必要です。_私はさらに調査をしています。 –

+0

ええ、申し訳ありませんが、私は言語を少し混ぜています。私はエラーを削除しました、今すぐ動作するはずです。 – weltraumpirat

+0

[link] http://blog.benstucki.net/?p=42を勉強して周りに道を見つける。本質は埋め込まれたアイコンは自動生成された 'クラス'を持っています。 Ben Stuckiの例には静的な辞書があり、これは 'クラス'の正しいローダーを返すために使用されます。 –

0

にあなたの関数を変更する必要がありますので、問題はiconFunctionが期待された、ないアイコン自体を、ツリーコントロールによってインスタンス化されるアイコンのクラスを取得したいですクラス。各埋め込み画像には、コンパイラによって自動的に生成されるサブクラスがあります。 @weltraumpiratが正しい方向に向いてくれてくれてありがとう:-)

目的は、アイコンをツリークラスに動的に表示することでした。 Ben Stucki(http://blog.benstucki.net/?p=42)が作成したクラスをTreeItemRenderer.dataオブジェクトで使用するように変更することはできますが、カスタムMXTreeItemRendererを作成すると失敗します。

最終的にBitmapImageとカスタムのTreeItemRendererを作成しました。このオブジェクトは、クラス内で事前に設定されたiconBitmap属性を使用してアイコンを動的に読み込みます。

package components 
{ 

    import flash.display.BitmapData; 

    import mx.core.mx_internal; 

    import spark.core.IContentLoader; 
    import spark.primitives.BitmapImage; 

    public class RuntimeBitmapImage extends BitmapImage 
    { 
     public function RuntimeBitmapImage() 
     { 
      super(); 
     } 

     public function set bitmapData(bitmapData:BitmapData):void 
     { 
      super.setBitmapData(bitmapData, false); 
     } 

    } 
}  



<?xml version="1.0" encoding="utf-8"?> 
<s:MXTreeItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" > 

    <fx:Script> 
     <![CDATA[ 


      override public function set data(value:Object):void { 
       super.data = value; 

       if (value != null) { 

        if (value.iconBitmap != null) { 
         runtimeBitmapImage.bitmapData = value.iconBitmap.bitmapData ; 
        } 

       } 


      } 

     ]]> 
    </fx:Script> 

    <s:states> 
     <s:State name="normal" />    
     <s:State name="hovered" /> 
     <s:State name="selected" /> 
    </s:states> 


    <s:HGroup left="0" right="0" top="0" bottom="0" paddingTop="2" verticalAlign="middle"> 
     <s:Rect id="indentationSpacer" width="{treeListData.indent}" percentHeight="100" alpha="0"> 
      <s:fill> 
       <s:SolidColor color="0xFFFFFF" /> 
      </s:fill> 
     </s:Rect> 
     <potentiate:RuntimeBitmapImage id="runtimeBitmapImage" left="2" width="18" /> 
     <s:Label id="labelField" text="{treeListData.label}" paddingTop="2"/> 
    </s:HGroup> 

</s:MXTreeItemRenderer>