为什么有时DisplayObject的子项的.name属性和getChildByName()的结果不同?

时间:2020-03-06 14:31:24  来源:igfitidea点击:

谁能解释显示对象的"名称"属性与getChildByName(" XXX")函数找到的值之间的区别?在90%的时间内,它们都是一样的,直到它们消失了,事情才瓦解。

例如,在下面的代码中,我仅通过直接检查孩子的name属性来按实例名称查找对象; getChildByName()失败。

var gfx:MovieClip = new a_Character(); //(a library object exported for Actionscript)

var do1:DisplayObject = null;
var do2:DisplayObject = null;

for( var i:int = 0 ; i < gfx.amSword.numChildren ; i++ )
{
    var child:DisplayObject = gfx.amSword.getChildAt(i);
    if( child.name == "amWeaponExchange" )  //An instance name set in the IDE
    {
        do2 = child;
    }
}

trace("do2:", do2 );

var do1:DisplayObject = gfx.amSword.getChildByName("amWeaponExchange");

生成以下输出:

do2: [object MovieClip]
ReferenceError: Error #1069: Property amWeaponExchange not found on builtin.as
var do1:DisplayObject = gfx.amSword.getChildByName["amWeaponExchange"];
.MethodClosure and there is no default value.

有什么想法Flash在想什么?

解决方案

我还没有真正了解你在做什么。但是我发现的一件事是,在第一帧中访问MovieClip的子级有点不可靠。例如,我们不能gotoAndStop()然后访问该框架上的所有子项,则必须等待一个框架,然后这些子项才可用。

在一个地方,我们正在遍历gfx.amSword,而在另一个地方,e.gfx.amSword则错过了e。 ?

另外,这不是造成问题的原因,但类名应以大写字母开头,并且不包含下划线。 " a_Character"应仅为" Character"。

糟糕,我们对e,Iain的看法是正确的,但这不是问题,我从代码中删除了e以关注问题,但没有抓住那个问题。

我想我应该发布一个更清晰的失败例子。有趣的类名只是我个人为Flash IDE自动生成的带有"导出为Actionscript"的类的命名约定,但这使问题感到困惑。

我误解了我的第一个答案。

这可能与Flash IDE的"发布"设置有关:" ActionScript 3.0设置"对话框中的"自动声明舞台实例"。

看来我们已自行修复!

和:

ReferenceError: Error #1069: Property amWeaponExchange not found on builtin.as
var do1:DisplayObject = gfx.amSword.getChildByName("amWeaponExchange");
.MethodClosure and there is no default value.

我们得到错误:

##代码##

因为编译器正在实际的getChildByName方法上寻找属性" amWeaponExchange"。

当我们将其更改为:

##代码##

正如我们在编辑中所做的那样,它可以成功找到子项并进行编译。