我对下面这段代码中的内容感到困惑。我有一个盒子容器,有一个子按钮(我指定的名称)。我编写了一个函数,试图按名称查找子按钮。但是,这不能按预期工作 - 原因是Box由于某种原因而且numChildren = 0,我希望它是1,因为我有一个按钮作为孩子添加到它。有人能帮助我理解我做错了吗?
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<mx:Box height="100%" width="100%" initialize="initializeApp();" name="MyBox">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.controls.Button;
import mx.core.FlexGlobals;
public function initializeApp():void {
var btn:Button = new Button();
btn.name = "MyButton";
addElement(btn);
btn.addEventListener(MouseEvent.CLICK, clickCallback);
}
private function clickCallback(event:MouseEvent):void{
var obj:DisplayObject = findChildByName(FlexGlobals.topLevelApplication as DisplayObjectContainer, "MyButton");
if (obj==null){
Alert.show( "Not Found");
}
else{
Alert.show( "Found");
}
}
private function findChildByName(parent:DisplayObjectContainer, name:String):DisplayObject{
var childCount:Number = (parent==null) ? 0 : parent.numChildren;
for (var i:Number=0;i<childCount;i++){
var child:DisplayObject = parent.getChildAt(i);
if (child is DisplayObjectContainer){
return findChildByName(child as DisplayObjectContainer, name);
}
else{
if (parent!=null && child == parent.getChildByName(name)){
return child;
}
}
}
return null;
}
]]>
</fx:Script>
</mx:Box>
</s:WindowedApplication>
谢谢。
答案 0 :(得分:0)
我的猜测,该项可能会被添加到子对象中,在您的情况下它是Box,因为,您的代码直接在框中,指定MyBox.addElement。或FlxGobal.toplevelapp.addElement(
答案 1 :(得分:0)
parent
包含DisplayObjectContainer,findChildByName将提前返回。
if (child is DisplayObjectContainer){
return findChildByName(child as DisplayObjectContainer, name);
}
这将返回找到的对象,如果在该容器中找不到对象,则返回null。
更好的是,由于Button是一个DisplayObjectContainer,你会试着深入研究它,而不检查对象本身是否是你正在寻找的对象。
在进一步深入挖掘之前,您需要先检查孩子是否是您的目标;那么,只有在你找到孩子的情况下才会从递归检查中返回。类似的东西:
if (parent != null && child.name == name) // Just check the name rather than getChildByName
{
return child;
}
if (child is DisplayObjectContainer){
var foundChild:DisplayObject = findChildByName(child as DisplayObjectContainer, name);
if (foundChild) {
return foundChild;
}
}