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

时间:2010-01-29 14:31:46

标签: 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自动完成框。我已将适当的fla文件导入CS4,并将一个AutoComplete框放入我的Swf中。一切都很好,但加载Swf时会出现上述错误。我的想法是AutoComplete框试图创建ScrollPane作为其功能的一部分。好的,我理解这一点,所以我将ScrollPane组件添加到库中也具有相同的结果。

通常我会搞乱库组件/设置,直到我摆脱错误,但我厌倦了碰到这个,我想知道解决问题的正确方法。所以,我有几个问题:

  • 您何时需要将组件添加到Fla的库而不是仅仅在代码中创建组件?

  • 您需要将哪些Flas添加到?只是一个使用它?或者Fla的所有父母呢?

  • 假设Autocomplete组件需要ScrollPane组件。添加单个组件时,为什么不识别此依赖关系?为什么我必须明确添加它?

  • 将组件添加到库中,并将其添加到库的“Component Assets”文件夹之间有什么区别?这个文件夹的用途是什么?

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我不确定我是否理解你的设置。我假设你有一个包含一些组件的子fla,你需要在父(loader)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的页面,但是说实话我并没有完全理解它。

HTH, 乔治