在开发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中,并将“自动完成”框放入了我的Swf文件中。一切正常,但在加载Swf时发生上述错误。我的想法是,“自动完成”框正在尝试创建ScrollPane作为其功能的一部分。好的,我理解了这一点,所以我也将ScrollPane组件添加到了库中,并得到了相同的结果。
通常,我只会弄乱库的组件/设置,直到摆脱错误为止,但是我讨厌遇到这个问题,并且我想知道解决问题的正确方法。因此,这里有几个问题:
我真的需要这个AutoComplete组件才能工作。假设AS3代码正确,并且仍然出现上述错误,您认为哪些设置可能不正确?出于无奈,我尝试将所有可能的组件添加到库中以及库的组件 Assets 文件夹中,只是为了有一个起点,但是仍然出现错误。
任何帮助表示赞赏。
最佳答案
我不确定我是否了解您的设置。我假设您有一个包含某些组件的子fla,并且需要在parent(loader)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);
}
在ActionScript 3.0编程中有一个页面介绍此类问题以及如何使用ApplicationDomain,但是老实说,我并没有完全理解它。
HTH,
乔治