Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在flex中按名称查找子代_Actionscript 3_Flash_Apache Flex_Actionscript_Flex3 - Fatal编程技术网

Actionscript 3 在flex中按名称查找子代

Actionscript 3 在flex中按名称查找子代,actionscript-3,flash,apache-flex,actionscript,flex3,Actionscript 3,Flash,Apache Flex,Actionscript,Flex3,我对下面代码中的内容感到困惑。我有一个盒子容器,它有一个子按钮(我已经指定了它的名称)。我已经编写了一个函数,尝试按名称查找子按钮。但是,这并没有像预期的那样起作用-原因是由于某种原因,框中的numChildren=0,我希望它是1,因为我作为一个孩子添加了一个按钮。有人能帮我理解我做错了什么吗 <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/

我对下面代码中的内容感到困惑。我有一个盒子容器,它有一个子按钮(我已经指定了它的名称)。我已经编写了一个函数,尝试按名称查找子按钮。但是,这并没有像预期的那样起作用-原因是由于某种原因,框中的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>


谢谢。

我猜,项目可能会添加到子对象中,在您的情况下,它是Box,因为您的代码直接在框中,请指定MyBox.addElement。如果父级包含DisplayObjectContainer,则findChildByName将提前返回

if (child is DisplayObjectContainer){
    return findChildByName(child as DisplayObjectContainer, name);
}
这将返回找到的对象,如果在该容器中找不到对象,则返回null

更好的是,因为按钮是一个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;
    }
}

为什么不直接使用
event.target
?就是这样。非常感谢。