代码之家  ›  专栏  ›  技术社区  ›  Erix

向Swf库中添加组件的正确方法是什么?

  •  5
  • Erix  · 技术社区  · 15 年前

    在开发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() 
    

    现在,我正在尝试使用AstraFlash自动完成框。我已经将正确的fla文件导入CS4,并在Swf中放置了一个自动完成框。一切都构建得很好,但在加载Swf时会出现上述错误。我的想法是,自动完成框试图创建一个滚动窗格作为其功能的一部分。好的,我理解这一点,所以我将ScrollPane组件添加到库中,并获得相同的结果。

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

    • 假设自动完成组件需要一个滚动窗格组件。为什么在添加一个组件时无法识别此依赖关系?为什么我必须明确地添加它?

    我真的需要这个自动完成组件来工作。假设AS3代码是正确的,而我仍然得到上述错误,您认为哪些设置可能不正确?出于挫败感,我尝试将所有可能的组件添加到库中,以及库的component assets文件夹中,只是为了有一个起点,但仍然出现了错误。

    感谢您的帮助。

    1 回复  |  直到 14 年前
        1
  •  2
  •   George Profenza    15 年前

    我不知道我是否明白你是被陷害的。我假设您有一个子fla,其中包含一些组件,您需要在父(加载程序)fla中创建这些组件的实例。

    如果您将子fla中的类编译到父fla中,那么它应该可以工作,但这会复制一些内容。

    问题是,当您加载swf时,类位于不同的位置 ApplicationDomain 简单地说,这就是管理swf中的类的方法,这样就不会在加载程序和加载的swf以及其他一些安全性东西之间发生类冲突。

    我制作了一个简单的fla,其中包含一个按钮组件(fl.controls.Button),并从加载程序fla加载该组件。我没有将按钮组件添加到加载程序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);
    }
    

    在编程ActionScript3.0中有一页关于这类问题以及如何使用ApplicationDomain,但老实说,我并没有完全理解它。

    乔治