ActionScript 3 - 使用[方括号]而不是getChildByName

时间:2014-07-20 18:08:01

标签: actionscript-3 casting

我在库中有一个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";
}

3 个答案:

答案 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中的addChildAtsetChildAtDisplayObjectContainer时,这是不可能的。

始终是通过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;
}