为什么有时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.asvar 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.asvar do1:DisplayObject = gfx.amSword.getChildByName("amWeaponExchange");.MethodClosure and there is no default value.
我们得到错误:
##代码##因为编译器正在实际的getChildByName方法上寻找属性" amWeaponExchange"。
当我们将其更改为:
##代码##正如我们在编辑中所做的那样,它可以成功找到子项并进行编译。