5

外部swfをロードするswfがあります。ローダーswfには、ロードされたswfからアクセスしたい変数があります。使用しますMovieClip(parent.parent).myVarが、このエラーが返されます

TypeError:エラー#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません。card01_fla :: MainTimeline / frame1()で

ローダーswfには、問題だと思うカスタムドキュメントクラスがあります。

前もって感謝します。

編集

これはメインのswfの時点です

    package 
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.text.TextField;

    /**
     * ...
     * @author chchrist
     */
    public class CardSender extends Sprite 
    {

        private var loader:Loader;
        private var viewButtonArray:Array;
        private var sendButtonArray:Array;
        private var cardContainer:Sprite;

        public var testVar:String

        public function CardSender() {

            testVar = "it worked!!!";
            init();
        }

        private function init() {
            viewButtonArray = [cardsenderMC.view01, cardsenderMC.view02, cardsenderMC.view03, cardsenderMC.view04];

            for each( var viewButton in viewButtonArray) {
                viewButton.buttonMode = true;
                viewButton.addEventListener(MouseEvent.CLICK, onViewClick);
            }
        }

        private function onViewClick(e:MouseEvent):void {
            var cardName = "card"+e.target.name.substring(4)+".swf";
            loader = new Loader();
            loader.load( new URLRequest(cardName));
            loader.contentLoaderInfo.addEventListener(Event.INIT, onCardInit);
        }

        private function onCardInit(e:Event):void {
            addChild(loader);
            var content:* = loader.content;
            content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick);
        }

        private function onCloseClick(e:MouseEvent):void {
            removeChild(loader);
        }

    }
}

そして私はこのコードでロードされたswfからテスト変数にアクセスしようとしています

trace(MovieClip(parent.parent).testVar);

編集#2

onCardInitではaddChild(loader)なくonViewClickにあり、ロードされたswfの最初のフレームにある場合、Object(parent.parent).testVarそれは機能します...しかし、なぜonCardInit関数内に入れたくないのですか?

4

5 に答える 5

2

loader変数が1つだけで、4つのLoaderインスタンスを作成して割り当てています。したがって、4つすべてをすばやく連続してクリックすると、loader変数Loaderにはラストクリックに対応するオブジェクトが効果的に含まれます。すべてのaddChild呼び出しは同じオブジェクトに作用しLoaderます-他の呼び出しは追加されず、それらの親は引き続き追加されますnull

コードに次の変更を加えます。

private function onCardInit(e:Event):void 
{
    addChild(LoaderInfo(e.currentTarget).loader);
    var content:DisplayObject = loader.content;
    trace(content);
    trace(content.closeButton);
    content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick);
}

private function onCloseClick(e:MouseEvent):void 
{
    trace(e.currentTarget);//should be the closeButton
    trace(e.currentTarget.parent);//should be the loaded swf
    trace(e.currentTarget.parent.parent);//should be the Loader object that loaded it

    //The following will work only if last three traced correctly
    removeChild(e.currentTarget.parent.parent);
}

質問の次の更新に答えてください。

addChild(loader)onViewClick代わりにonCardInitIを使用するObject(parent.parent).testVarと、ロードされたswfの最初のフレームで機能します。onCardInit関数内にaddChildを使用すると、機能しないのはなぜですか?

繰り返しますが、これは別のloaderオブジェクトを追加していることが原因である可能性があります。複数のビューボタンをクリックしていますか?表示ボタンをクリックし、ロードされるまで待って、機能することを確認します。

于 2009-11-25T16:25:03.420 に答える
2

parent.parentが間違っています。使用してみてください:

MovieClip(MovieClip(e.currentTarget.parent).parent).myVar ;

最初の親をMovieClipなどのクラスにキャストしてから、この新しいMovieClipの親を取得してから、変数の内部を取得する必要があります。

于 2012-08-07T05:44:03.023 に答える
0

parentとparent.parentをトレースしてみてください。これは、追加の「親」が原因であると確信しています。

于 2009-11-25T16:03:25.410 に答える
0

loader.contentはムービークリップではないため、同じ機能はありません。試す

myLoadedClip:MovieClip = MovieClip(loader.content);

次に、myLoadedClip.parent.myVarが表示されます。

ハンドラーをEvent.INITではなくEvent.COMPLETEで起動したい場合があります

于 2013-10-17T15:48:53.893 に答える
0

ロードされたswfのこの唯一のラインコードはそれを解決します!;)

MovieClip(MovieClip(parent.parent).root).play();

于 2016-05-26T19:04:42.643 に答える