我正在尝试使用Adobe AIR创建一个API实用程序,其中给定一个组件名称,它应该列出该组件的所有方法,变量和其他属性。
但是我找不到一个API来列出所有Flex / Flash的UIComponents。
是否有用于查找所有UIComponent的API,或者如果没有这样的API,有人可以告诉我如何查找组件吗?
注意:我尝试过使用flash.utils.describeType()但是它不能满足我的要求,因为方法的输入是使用TextInput动态传递的。
〜Jegan
答案 0 :(得分:1)
听起来你在问两件事:
第一个可以使用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文档中提取正确的页面可能是最简单的。