0

Loader() クラスを介して swf をロードします。swf がロードされると、root のすべての子をループし、removeChild() で TextField を削除します。これは最初は機能します - TextField は削除されます。しかし、ロードされた swf のトゥイーンが終了してループすると、削除された TextField がどういうわけか再表示されます。TextField は動的テキストです。一部の StaticText を削除すると、これは削除されたままになります。ここで何が起こっているのですか?

loopChildren(root);
function loopChildren(dispObj:*):void {
    for (var i:int = 0; i< dispObj.numChildren; i++) {
        var obj:DisplayObject = dispObj.getChildAt(i);
        if (obj is DisplayObjectContainer) {
            loopChildren(obj);
        }
        else {
            if (obj is TextField) {
                obj.parent.removeChild(obj);
                i--;
            }
        }
    } 
}

すべての子に対してタイマー (5 秒間隔) と trace(obj.name) を指定して loopChildren を呼び出すと、obj.name が変更されることがわかります。TextField は、instance11、instance32、instance54 などと呼ばれます。新しいインスタンスが作成され、継続的に追加されているようですか?

編集: コードを swf に直接転送し、ラッパーを使用せずに実行すると、期待どおりに動作します。別の映画から読み込まれたときに何かが欠けているに違いありませんか?

EDIT2: 削除しようとしている TextField は、トゥイーンと同じタイム ライン上の別のレイヤーにあると言わざるを得ません。トゥイーンを独自のタイムラインに配置すると、期待どおりに動作するようです。しかし、動的テキストとトゥイーンは共存できないのでしょうか?

4

2 に答える 2

2

テキスト フィールドがステージ上で定義されているように聞こえます (つまり、スクリプトによってインスタンス化されていない FLA 内)。それが存在するレイヤーには、トゥイーンのある時点で再生されるキーフレームがある可能性があります。

それが正しければ、あなたが直面しているのは、タイムラインとスクリプト環境の競合する性質に関する Flash のかなり低レベルの制限です。トゥイーンを再生すると、すべてのタイムライン キーフレームが、その時点でステージ上にあるオブジェクトの種類や位置などに関する情報を Flash 用にエンコードします。

しかし、同じオブジェクトをスクリプトで参照し始めると、通常、Flash は、スクリプトを優先するか、タイムラインの情報を優先するかを推測する必要があります。この場合、スクリプトを使用してテキスト フィールドを削除した後、トゥイーンが再生するフレームの 1 つが同じフィールドを参照し、Flash は削除が永続的であるべきかどうか、またはそれを尊重するかどうかを認識していない可能性があります。キーフレームを削除し、フィールドを再作成します。

したがって、あなたの質問に対する短い答え (遅すぎる!) は、一般に、タイムライン トゥイーンまたはスクリプトを使用してステージ要素を処理するようにしてください。両方を使用することはできません。これが、編集#2のソリューションが機能した理由です。トゥイーンを独自のタイムラインに移動することで (おそらく)、問題のテキスト フィールドに関する情報をエンコードするキーフレームをまたいで再生する必要がなくなるからです。別の解決策は、タイムラインを介して問題のあるテキスト フィールドを削除することです (そのテキスト フィールドが存在しないキーフレームを再生することにより)。または、もちろん、スクリプトだけでテキストフィールドを制御して作成および破棄することもできるので、タイムラインの一部にはなりません。

于 2009-09-05T06:17:05.250 に答える
0

テキストフィールドを空に設定しないのはなぜですか?

loopChildren(root);

function loopChildren(dispObj:DisplayObjectContainer):void 
{
    for each(var i:int = 0; i < dispObj.numChildren; i++) 
    {
        var obj:DisplayObject = dispObj.getChildAt(i);
        if (obj is DisplayObjectContainer) 
        {
            loopChildren(obj);
        }
        else if (obj is TextField) 
        {
            TextField(obj).text = "";
        }
    } 
}
于 2009-09-05T12:20:23.093 に答える