Eri*_*rix 5 flash adobe actionscript-3 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()
Run Code Online (Sandbox Code Playgroud)
现在,就我而言,这个错误源于在代码中初始化组件时尚未明确添加到CS4中fla的组件库中.在过去,我尝试在代码中动态创建ScrollPanes时遇到了这个问题.我通过将ScrollPane组件添加到Main.fla的库中来解决它.这似乎有一段时间了.
现在,我正在尝试使用AstraFlash AutoComplete框.我已将适当的fla文件导入CS4,并将一个AutoComplete框放入我的Swf中.一切都很好,但加载Swf时会出现上述错误.我的想法是AutoComplete框试图创建ScrollPane作为其功能的一部分.好的,我理解这一点,所以我将ScrollPane组件添加到库中,结果相同.
通常我会搞乱库组件/设置,直到我摆脱错误,但我厌倦了碰到这个,我想知道解决问题的正确方法.所以,我有几个问题:
您何时需要将组件添加到Fla的库而不是仅仅在代码中创建组件?
您需要将哪些Flas添加到?只是一个使用它?或者Fla的所有父母呢?
假设Autocomplete组件需要ScrollPane组件.添加单个组件时,为什么不识别此依赖关系?为什么我必须明确添加它?
将组件添加到库并将其添加到库的"Component Assets"文件夹之间有什么区别?这个文件夹的用途是什么?
我真的需要这个AutoComplete组件才能工作.假设AS3代码是正确的,并且我仍然遇到上述错误,您认为哪些设置可能不正确?出于沮丧,我尝试将每个可能的组件添加到库,以及库的组件资源文件夹只是为了有一个起点,但我仍然得到错误.
任何帮助表示赞赏.
我不确定我是否理解你的设置。我假设你有一个包含一些组件的子 fla,并且你需要在父(加载器)fla 中创建这些组件的实例。
如果您将子 fla 中的类编译到父 fla 中,它应该可以工作,但这会重复一些事情。
问题是当您加载 swf 时,这些类位于不同的ApplicationDomain中。简而言之,它是管理 swf 中的类的东西,因此加载器和加载的 swf 以及其他一些安全内容之间不会发生类冲突。
我制作了一个简单的 fla,其中包含一个 Button 组件(fl.controls.Button)并从加载器 fla 加载它。我没有将 Button 组件添加到加载器 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);
}
Run Code Online (Sandbox Code Playgroud)
《Programming Actionscript 3.0》中有一个页面介绍了此类问题以及如何使用 ApplicationDomain,但说实话我并没有完全理解它。
HTH,乔治