2011-08-13 11 views
0

親(非表示オブジェクト)クラスで構成されたMovieClipを持っています。そのムービークリップに対してイベントリスナーを登録します。たとえば、CLICKハンドラです。イベントの後に作成されたMovieClipの(親)クラスを取得します。

event.targetで、イベントハンドラ内からMovieClipへの参照を取得できます。しかし、どのように私はその構成クラスへの参照を引き出すことができますか?

ダイナミックMovieClipクラスに「parentClass」プロパティを追加するだけでも問題はありませんが、もっとエレガントで慣れている方法があるのか​​どうか疑問です。

答えて

1

MovieClipを作成するクラスが表示オブジェクトでない場合、実際にその親とはみなされません。親要素は、MovieClipがアタッチされる要素です。作成クラスに含まれるものはすべて、オブジェクトへの参照です。別の場所でMovieClipを参照する場合とまったく同じです。

私の好みの方法は、作成するクラスへの参照を含むことができるMovieClipの子孫クラスを作成することです。これをMovieClipの代わりに使用します。

package { 
    import flash.display.MovieClip; 

    public class MovieClipWithRef extends MovieClip 
    { 
     private var _parentRef:Object; //obviously cast this as accurately as possible 

     public function MovieClipWithRef($ref:Object):void 
     { 
      _parentRef = $ref; 
     } 

     public function get parentRef():Object 
     { 
      return _parentRef; 
     } 
     //no setter makes this property read-only once set by the constructor 
    } 
} 
+0

ありがとう! MCが既に「ステージ」に入っているデザインタイムのクリップの場合はどうなりますか?これは何か変わるでしょうか? –

+0

ステージ上のMovieClipだけの場合は、 'parent'を使って最初の表示ツリーの祖先を見つけることができます。それはあなたが意味することですか? – shanethehat

+0

いいえ、私はまだ非表示オブジェクトクラスでそれを構成していましたが、ADDED_TO_STAGEの後にステージで見つかったのは1度だけです。私はあなたがMovieClipWithRefとしてそれをキャストし、あなたの陽気な方法で行くと思いますか? –

1

この回答は本質的にはシャンと同じですが、複合デザインパターンも組み込まれています。次の例を見てください:

ICompositeObject.as:

package com.flashdevelopprojects.patterns.composite 
{ 
    public interface ICompositeObject 
    { 
     function get parentObject():Object 

    }// end interface 

}// end package 

CompositeObject.as:

package com.flashdevelopprojects.patterns.composite 
{ 
    public class CompositeObject implements ICompositeObject 
    { 
     private var _parentObject:Object; 

     public function get parentObject():Object { return _parentObject } 

     public function CompositeObject(parentObject:Object) 
     { 
      _parentObject = parentObject; 

     }// end function 

    }// end class 

}// end package 

Main.as(ドキュメントクラス):

package 
{ 
    import com.flashdevelopprojects.patterns.composite.CompositeObject; 
    import com.flashdevelopprojects.patterns.composite.ICompositeObject; 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var a:A = new A(); 
      a.b.addEventListener(Event.ADDED_TO_STAGE, onBAddedToStage); 
      addChild(a.b); 

     }// end function 

     public function onBAddedToStage(e:Event):void 
     { 
      var b:ICompositeObject = ICompositeObject(e.target); 

      trace(b.parentObject); // output: A 

     }// end function 


    }// end class 

}// end package 

import com.flashdevelopprojects.patterns.composite.CompositeObject; 
import com.flashdevelopprojects.patterns.composite.ICompositeObject; 
import flash.display.MovieClip; 

internal class A 
{ 
    private var _b:B; 

    public function get b():B { return _b } 

    public function A() 
    { 
     _b = new B(this); 

    }// end function 

    public function toString():String { return "A" } 

}// end class 

internal class B extends MovieClip implements ICompositeObject 
{ 
    private var _compositeObject:CompositeObject; 

    public function get parentObject():Object { return _compositeObject.parentObject } 

    public function B(parentObject:Object) 
    { 
     _compositeObject = new CompositeObject(parentObject); 

    }// end function 

}// end class 
+0

複合DPを使用する場合+1。 –

関連する問題