是否有来自Flex / Flash的API列出所有UIComponent?

时间:2010-02-17 10:34:15

标签: flex air

我正在尝试使用Adobe AIR创建一个API实用程序,其中给定一个组件名称,它应该列出该组件的所有方法,变量和其他属性。

但是我找不到一个API来列出所有Flex / Flash的UIComponents。

是否有用于查找所有UIComponent的API,或者如果没有这样的API,有人可以告诉我如何查找组件吗?

注意:我尝试过使用flash.utils.describeType()但是它不能满足我的要求,因为方法的输入是使用TextInput动态传递的。

〜Jegan

2 个答案:

答案 0 :(得分:1)

听起来你在问两件事:

  1. 如何列出UIComponent的所有属性/方法。
  2. 如何列出Flex SDK中的所有UIComponents。
  3. 第一个可以使用describeType()完成。鉴于方法是使用TextInput 动态传递的,您需要将所有UIComponent都包含在SWF中。您可以使用以下include语句为SDK中的每个组件执行此操作(此示例与Button一起使用):

    include mx.controls.Button; Button;

    然后你可以这样做:

    var className:String = myTextArea.text; // mx.controls::Button or mx.controls.Button
    var clazz:Class = flash.utils.getDefinitionByName(className);
    var methods:Array = getMethods(clazz);
    var properties:Array = getProperties(clazz); // write a similar method for accessors and variables
    
    /**
     *  Returns a list of methods for the class.
     * Pass in the superclass depth for how many classes
     * you want this to return (class tree).  If it's -1, it will return the whole method list
     */
    public static function getMethods(target:Object, superclassDepth:int = -1, keepGeneratedMethods:Boolean = false):Array
    {
     var description:XML = DescribeTypeCache.describeType(target).typeDescription;
     var hierarchy:Array = getHierarchy(target);
     var methodList:XMLList = description..method;
     methodList += description.factory..method; // factory is required if target is Class
     var methodName:String
     var methods:Array = [];
     var declaredBy:String;
     var methodXML:XML;
     var i:int = 0;
     var n:int = methodList.length();
     for (i; i < n; i++)
     {
      methodXML = methodList[i];
      declaredBy = methodXML.@declaredBy;
      methodName = methodXML.@name;
      // we break because the xml list is orded hierarchically by class!
      if (superclassDepth != -1 && hierarchy.indexOf(declaredBy) >= superclassDepth)
       break;
      // ignore methods that start with underscore:
      if (methodName.charAt(0) == "_" && !keepGeneratedMethods)
       continue;
      methods.push(methodName);
     }
     // sort the method list, so there's some kind of order to the report:
     methods.sort(Array.CASEINSENSITIVE);
     return methods;
    }
    

    第二个,在SDK中列出UIComponents,有点复杂,因为SDK中没有稳定的组件列表(取决于版本等)。但是,可以做的是获取swf中包含的每个类的列表。您可以通过生成Link Report(用于帮助模块)来实现这一点,这只是一个编译器参数:

    -link-report=my_report.xml

    然后你可以找到一种方法来找到该文件中唯一的xml节点,以及哪些节点扩展了UIComponent。我使用ruby和nokogiri xml parser for ruby来做到这一点。还有一个整洁的AIR app to visualize the Link Report

    如果你正在做第一种情况,那么该方法应该让你开始列出UIComponent的所有属性/方法。如果你正在做第二个,那将为你提供swf中包含的所有UIComponents的列表。

    如果有帮助,请告诉我 兰斯

答案 1 :(得分:0)

除了显示数据外,您是否需要对数据执行任何操作?如果没有,从Adobe的在线API文档中提取正确的页面可能是最简单的。