actionscript-3 - 将组件添加到 Swf 库的正确方法是什么?

标签 actionscript-3 adobe flash flash-cs4 flash-v3-components

在开发 Flash 项目的过程中,我遇到了一个困扰我很多次的问题。它看起来像这样:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at fl.containers::BaseScrollPane/fl.containers:BaseScrollPane::drawBackground()
at fl.controls::TileList/fl.controls:TileList::draw()
at fl.core::UIComponent/::callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/addChildAt()
at fl.controls::BaseButton/fl.controls:BaseButton::drawBackground()
at fl.controls::BaseButton/fl.controls:BaseButton::draw()
at fl.core::UIComponent/drawNow()
at fl.controls::ScrollBar/fl.controls:ScrollBar::draw()
at fl.core::UIComponent/::callLaterDispatcher() 

现在,就我而言,此错误源于在代码中初始化组件,而这些组件尚未明确添加到 CS4 中的 fla 组件库中。过去,我在尝试在代码中动态创建 ScrollPanes 时遇到过这个问题。我通过将 ScrollPane 组件添加到我的 Main.fla 库中解决了这个问题。这似乎工作了一段时间。

现在,我正在尝试使用 AstraFlash AutoComplete 框。我已将正确的 fla 文件导入 CS4,并将一个 AutoComplete 框放入我的 Swf。一切正常,但加载 Swf 时出现上述错误。我的想法是 AutoComplete 框试图创建一个 ScrollPane 作为其功能的一部分。好的,我明白这一点,所以我也将 ScrollPane 组件添加到库中,结果相同。

通常我只会弄乱库组件/设置,直到我摆脱错误,但我厌倦了遇到这个问题,我想知道解决问题的正确方法。所以,我有几个问题:
  • 什么时候需要将组件添加到 Fla 的库中,而不仅仅是在代码中创建组件?
  • 您需要将组件添加到哪个 Flas?只是使用它的那个?还是那个佛罗里达州的所有 parent ?
  • 假设 Autocomplete 组件需要一个 ScrollPane 组件。为什么在添加一个组件时无法识别此依赖项?为什么我必须明确添加它?
  • 将组件添加到库与将其添加到库的“组件 Assets ”文件夹有什么区别?这个文件夹的用途是什么?

  • 我真的需要这个 AutoComplete 组件才能工作。假设 AS3 代码是正确的,但我仍然收到上述错误,您认为哪些设置可能不正确?出于沮丧,我尝试将所有可能的组件添加到库以及库的组件 Assets 文件夹中,只是为了有一个起点,但我仍然遇到错误。

    任何帮助表示赞赏。

    最佳答案

    我不确定我是否理解您的设置。我假设您有一个包含一些组件的子 fla,您需要在父(加载程序)fla 中创建这些组件的实例。

    如果您将子 fla 中的类编译到父 fla 中,它应该可以工作,但这会重复。

    问题是当您加载 swf 时,这些类位于不同的 ApplicationDomain 中.
    简而言之,这就是管理 swf 中的类的东西,因此您不会在加载器和加载的 swf 以及其他一些安全内容之间发生类冲突。

    我制作了一个简单的 fla,它包含一个 Button 组件(fl.controls.Button)并从加载器 fla 加载它。我没有将 Button 组件添加到 loader fla,而是使用加载的 swf 的应用程序域创建了一个按钮实例。就是这样:

    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
    loader.load(new URLRequest('componentContainer.swf'));
    
    function loaded(event:Event):void {
       addChild(loader.content);
       var SWFButton:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('fl.controls.Button') as Class;
       var button = new SWFButton();
       button.label = 'Test';
       addChild(button);
    }
    

    Programming Actionscript 3.0 中有一个关于此类问题以及如何使用 ApplicationDomain 的页面,但老实说我并没有完全理解它。

    哈,
    乔治

    关于actionscript-3 - 将组件添加到 Swf 库的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2162529/

    相关文章:

    actionscript-3 - 在 Flash 中强制软件渲染时 Context3D 不可用

    actionscript-3 - Flex 中自动建议文本框

    adobe - 在 Postscript 中画出这个循环

    javascript - 通过 VAST 标签的 SWF 广告未在 JW 播放器中播放

    javascript - XMLHttpRequest 方法的顺序很重要吗?

    正则表达式搜索给定单词前后的 5 个单词

    javascript - 在 JavaScript 中获取 AS3 MovieClip 的时间可能吗?

    javascript - 用于表单的 Adob​​e PDF JavaScript : showing & hiding labels depending on the conditions

    excel - 循环不打开 PDF...所以复制/粘贴到 Excel 失败(我认为)

    javascript - Action Script 3. 如何从Flash中的Movie Clip访问按钮?