Я последовал примеру из предыдущего вопроса , и я загружаю внешний SWF-файл, используя загрузчик, и внутри обработчика событий загрузчика. Я пытаюсь привести loader.content
в качестве своего пользовательского класса PanelReferenceClip
, который расширяет MovieClip
При публикации я получаю эту ошибку:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Просто для того, чтобы проверить и проверить правильность расположения swf и загрузку swf, я изменил тип содержимого на as MovieClip
, и он работал нормально.
РЕДАКТИРОВАТЬ: Я также хотел добавить, что эти SWF-файлы хранятся локально, а не через Интернет, несколько сетей или серверов.
Я не уверен, что сделал что-то необычное в своем классе, поэтому я предоставляю исходный код для своего пользовательского класса PanelReferenceClip
package com.components
{
import com.UI.DevicePanel;
import flash.display.MovieClip;
/**
* ...
*
* used to store the loaded swf inside the panel
*
* *parentPanel is set so that it is able to access it's parent Panel when needing
* to set parameters.
*/
public class PanelReferenceClip extends MovieClip
{
private var _parentPanel:DevicePanel;
private var _bg_mc:MovieClip;
private var _oldY:Number = 0;
private var _oldX:Number = 0;
private var _IsDragging:Boolean = false;
public function PanelReferenceClip() {
super();
}
/*--------------------------------------------------------------------------
* GETTERS AND SETTERS
* -----------------------------------------------------------------------*/
public function set parentPanel(p:DevicePanel):void {
_parentPanel = p;
}
public function get parentPanel():DevicePanel {
return _parentPanel;
}
public function get bg_mc():MovieClip {
try {
return getChildByName("bg_mc") as MovieClip;
} catch (e:Error) {
trace("could not find bg_mc in " + _parentPanel.DeviceName + " panel");
}
return null;
}
public function set oldY(n:Number):void {
_oldY = n;
}
public function get oldY():Number {
return _oldY;
}
public function set oldX(n:Number):void {
_oldX = n;
}
public function get oldX():Number {
return _oldX;
}
public function set IsDragging(b:Boolean):void {
_IsDragging = b;
}
public function get IsDragging():Boolean {
return _IsDragging;
}
}
}
Здесь часть другого класса, которая загружает SWF-файлы и затем пытается присвоить им класс prop_reference типа PanelReferenceClip
. Я делаю это, поэтому я могу получить доступ к SWF и его дочерним элементам, потому что, когда вы импортируете SWF, вы не можете установить имя экземпляра импортированного SWF. Поэтому я назначаю ему собственный класс, который расширяет MovieClip
, поэтому я могу хранить некоторые пользовательские свойства.
private function handleLoad(e:Event):void
{
e.target.removeEventListener(Event.COMPLETE, handleLoad, false);
// keep reference to the content
_reference = e.target.content as PanelReferenceClip;
// ** BREAKS ON THE NEXT LINE **/
trace(_reference.numChildren);
// add loader to the display list so we can see the external SWF.
addChild(e.target.loader);
// signal the sim engine that the swf has loaded
// and to go ahead and wire up the components
dispatchEvent(new DataEvent(DataEvent.COMPLETE));
initPanel();
}
Вот метод, используемый для загрузки SWF. Я добавил в контекст приложения часть, чтобы попробовать это, но я все еще никуда не доберусь.
public function loadSWF(theSWF:String):void
{
var url:String = theSWF;
var urlReq:URLRequest = new URLRequest(url);
_urlError = url;
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoad);
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
_loader.load(urlReq,context);
_loader.mouseEnabled = false;
}