2010-01-29 30 views
5

我一直有一个问题,在开发Flash项目的过程中困扰了我很多次。它看起来是这样的:现在将组件添加到Swf库中的正确方法是什么?

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

通常我只会乱搞图书馆的组件/设置,直到我摆脱了错误,但我厌倦了这种情况,并且我想知道解决问题的正确方法。因此,这里有我有几个问题:

  • 当你需要一个组件添加到佛罗里达州的图书馆,而不是仅仅在代码中创建的组件?

  • 您需要添加组件到哪些Flas?只有使用它的人?还是那个Fla的父母呢?

  • 假设自动完成组件需要一个ScrollPane组件。为什么添加一个组件时不能识别这种依赖关系?为什么我必须明确添加它?

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

我真的需要这个AutoComplete组件来工作。假设AS3代码是正确的,并且我仍然遇到上述错误,那么您认为哪些设置可能不正确?出于挫折感,我尝试将所有可能的组件添加到库中,以及添加到库的组件资产文件夹中,以便有一个起点,但我仍然遇到错误。

任何帮助表示赞赏。

回答

2

我不确定我是否理解您的设置。我假设你有一个包含一些组件的子fla,并且你需要在父(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编程页约thise样的问题,以及如何使用的ApplicationDomain,但我没有完全理解它是诚实的。

HTH, George

相关问题