2

我正在寻找一种方法,以在动态创建显示对象实例的子代?

trace(_view.getChildByName("name")) //returns name of display object (success)

trace(_view.getChildByName("name").getChildByName("name2")) //returns error 1061
4

3 回答 3

3

是的你可以。问题是DisplayObjectContainer.getChildByName()返回类型DisplayObject,并且任意显示对象可能是也可能不是DisplayObjectContainer。因此,虽然您可以这样做,但您首先需要将结果的类型转换为 DisplayObjectContainer:

public static function getGrandChildByName(
         parent : DisplayObjectContainer,
         child : String,
         grandchild : String
) : DisplayObject {
    var child_obj : DisplayObject = parent.getChildByName(child);
    var child_container : DisplayObjectContainer = child_obj as DisplayObjectContainer;
    return child_container.getChildByName(grandchild);
}

请注意,在我上面给出的示例中,我没有进行任何检查来验证孩子是否确实存在并且是 DisplayObjectContainer.... 在实际生产代码中,您可能想要添加此类检查。

另外,最后要注意的是,如果您使用的是 MovieClip 类型,您可以简单地通过其名称引用该对象:

  myclip.mc_child.mc_grandchild.gotoAndStop(3);

简单地按名称引用元素更简单且不易出错。我强烈推荐它。

于 2010-07-11T10:37:11.780 回答
3

虽然我确信迈克尔亚伦的回答会很有用......当我只需要参考一两个项目时,我会这样做:

trace( MovieClip( MovieClip( _view.getChildByName("name") ).getChildByName("name2") ).name );

这基本上只是强制显示对象像 MovieClip 一样工作,因此我可以读取它的 name 属性并在其上使用任何 MoveClip 方法。

如果您需要参考项目的整个显示,则可能需要更复杂的东西....

您还可以使用它来访问难以访问的 TextFields.... trace( TextField( MovieClip( _view.getChildByName("name") ).getChildByName("textfieldName") ).text );

于 2010-07-12T22:28:48.070 回答
-1
var parentMc1:Object=this.parent.getChildByName('myMc1') as Object;
var parentInMc2:Object=parentMc1.getChildByName('myMc2') as Object;

//parent.myMc1.myMc2.gotoAndStop(2); // WRONG
parentInMc2.gotoAndStop(2);  // TRUE
_______________
var parentMc2..
var parentMc3..
var parentMc4..
.
.
. 
Limitless mc using
于 2013-05-06T17:09:19.713 回答