在开发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组件添加到了库中,并得到了相同的结果。

通常,我只会弄乱库的组件/设置,直到摆脱错误为止,但是我讨厌遇到这个问题,并且我想知道解决问题的正确方法。因此,这里有几个问题:
  • 什么时候需要将组件添加到Fla的库中,而不仅仅是在代码中创建组件?
  • 您需要将组件添加到哪个Flas?只是一个使用它?还是那个Fla的所有 parent ?
  • 假设“自动完成”组件需要ScrollPane组件。为什么在添加一个组件时无法识别这种依赖关系?为什么必须显式添加它?
  • 将组件添加到库中并将其添加到库的“Component Assets”文件夹中有什么区别?此文件夹的用途是什么?

  • 我真的需要这个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,
    乔治

    10-07 19:32
    查看更多