我在库中有一个MovieClip,链接到MyObject
,它包含textField
。
我不知道如何在不使用textField
方法的情况下访问此getChildByName
。
显然,当对象在舞台上时(不使用addChild
),第3部分会起作用。但是当使用addChild
时,我认为必须有某种铸造;我不知道怎么做。
var childElement: MyObject = new MyObject();
childElement.name = "theChildElement";
container.addChild(childElement);
btn.addEventListener(MouseEvent.CLICK, changeText);
function changeText(event: MouseEvent): void
{
var targetBox:MovieClip = container.getChildByName(childElement.name) as MovieClip;
targetBox.textField.text = "hello"; // THIS WORKS
// This works too:
// MovieClip(container.getChildByName("theChildElement"))["textField"].text = "hello"; // THIS WORKS TOO.
// THIS DOESN'T WORK. why?
// container["theChildElement"]["textField"].text = "hello";
}
答案 0 :(得分:1)
你的第三种方法不起作用,因为你试图用它的名字来调用ChildElement
不使用getChildByName
方法。另一方面,您不应该调用textField textField
,因为它已经是一个actionScript属性。
你应该把它叫做' displayText'例如。
对于名为' displayText'的textField包含在childElement中:
function changeText(event:MouseEvent): void
{
childElement.displayText.text = "hello";
}
答案 1 :(得分:1)
尽管看起来令人困惑,但实例名称和名称并不相同。从您的代码中,您应始终能够通过其变量名称访问您的MC。为了让你的上一次工作,你可以使用它。
childElement["textField"].text = "hello";
答案 2 :(得分:1)
Flash IDE创建的符号之间存在差异,这些符号聚合其他DisplayObject并以编程方式创建DisplayObject。
在Flash IDE中创建DisplayObject时,可以使用它的实例名称将实例解析为属性 - 这意味着可以通过[]
访问它。 []
可用于访问动态声明类的属性或键 - 如MovieClip。这是必要的,因为您最有可能向下转换为MovieClip而不是使用Flash创建的符号类。仅使用addChild
API中的addChildAt
,setChildAt
或DisplayObjectContainer
时,这是不可能的。
始终是通过getChildByName
访问它的保存方式并检查null
,否则只要有人更改符号,您的应用,网站或其他任何内容都会注定1009错误。
我会创建一堆辅助方法,比如
// not tested
function getChildIn(parent:DisplayObjectContainer, names:Array):DisplayObject {
var child:DisplayObject, name:String;
while (names.length > 0) {
name = names.shift();
child = parent.getChildByName(name);
if (!child) {
// log it
return null;
}
if (names.length == 0) {
return child;
}
}
// log it
return null;
}
function getTextFieldIn(parent:DisplayObjectContainer, names:Array):TextField {
return getChildIn(parent, names) as TextField;
}
function getMovieClipIn(parent:DisplayObjectContainer, names:Array):MovieClip {
return getChildIn(parent, names) as MovieClip;
}