El problema me viene a la hora de eliminar/ocultar elementos de lista de visualización de la aplicación
cuando pasamos de un frame a otro. Voy a tratar de explicarme lo mejor posible, aunque aviso es algo denso....
1. //En el Frame1 de mi linea de tiempo general.
Código ActionScript :
var pantalla1:clasePantalla1=new clasePantalla1(); addChild(clasePantalla1);
-Muestro un tipo de pantalla que se 'construye' mediante una única clase (ayudada de otras clases hijas). A esta clase la llamaremos p.e. clasePantalla1.
Esta clase se forma a partir de dos clases que llamaremos claseComponenteTipo1+claseComponenteTipo2. Por tanto:
la clasePantalla1=claseComponenteTipo1+claseComponenteTipo2.
-La claseComponenteTipo1 es una barra de navegación generada dinámicamente a partir del contenido de un archivo XML (pero eso ahora no es importante).
Esta clase entre otras cosas detecta el evento del [CLICK] del mouse sobre sus botones (en realidad son Mc) y se lo comunica a la clase 'padre' mediante
la creación y propagación de eventos (dispatcher). En esto no me entretengo porque la detección y propagación de eventos funciona correctamente.
Proceso:
-claseComponenteTipo1 detecta [CLICK] sobre un botón y crea un nuevo evento que se propaga a la clase clasePantalla1.
-clasePantalla recibe el evento procedente de claseComponenteTipo1
-y mediante una función registrada para la detección del evento, detiene la propagación del mismo puesto que ya se ha recibido
Código ActionScript :
...
dispatcher = ClassDispatcher.getInstancia();
dispatcher.addEventListener(ClassDispatcher.TERMBAR_CLICK,DetectEvent);
...
private function DetectEvent(e:Event){
trace("Detecto el evento de la clase TermBar desde la clase TermScreen");
//1.Ocultamos elementos de la pantalla actual
RemoveAllComponents();
...
//3. Ya hemos detectado el evento, detenemos la propagación
e.stopImmediatePropagation();
...
//4. Cambiar de pantalla/frame
MovieClip(parent).gotoAndStop("pantallaN4_seccionTeoria");
}
-Elimina todos los comonentes previamente añadidos (en la linea de tiempo al iniciarse).
Código ActionScript :
...
public function RemoveAllComponents():void{
//1. Eliminar la barra de componenentes compartidos
if(sharedComponents!=null){
removeChild(sharedComponents);
}
//2. Eliminamos la barra de navegacion
if(termBar!=null){
removeChild(termBar);
}
//3. Eliminamos el contenedor de SWF
if(loader!=null){
removeChild(loader);
}
}
...-Cambia de frame (frame2)
Hasta aquí todo bien...Pasamos al frame 2
2.//Frame 2 de la línea de tiempo
Código ActionScript :
//0.1 Declaración de clases necesarias para componer la pantalla actual. var myInterface:Interface; var indexContent:IndexContent; //1. Iniciamos componentes de la pantalla (frame)->Interfaz+Contenido //1.1. Interfaz global myInterface=new Interface(); addChild(myInterface); //1.2. Contenidos indexContent=new IndexContent(); addChild(indexContent);
En este frame el contenido por pantalla lo mostraremos a partir de dos clases. Por tanto:
Pantalla2 (que NO clase)= claseInterface+claseContenido
-El funcionamiento de la claseInterfaz es confuso de explicar porque hay varios componentes q hacen diferentes
cosas según convenga pero me centraré en que hay un control que nos hace volver al frame anterior (frame1).
-Por otro lado la claseContenido muestra un contenido dinámico u otro dependiendo de la entrada indicada por el usuario en el
frame anterior (ésto tampoco es relevante ahora).
Proceso:
-claseInterfaz detecta evento [CLICK] sobre uno de sus controles
Código ActionScript :
componente.addEventListener(MouseEvent.CLICK, ThrowEvent);
-función detectora de evento [CLICK] dentro de la misma clase, entre otras cosas creará un evento que propagará a la claseContenidos.
Código ActionScript :
private function ThrowEvent(e:MouseEvent):void
{
....
dispatcher = ClassDispatcher.getInstancia();
dispatcher.dispatchEvent(new Event(ClassDispatcher.HIDE_CONTENT));
...
}
-En la claseContenidos tenemos un dispatcher para la escucha del evento externo q lo capta y actua al respecto mediante otra función detectora
Código ActionScript :
dispatcher = ClassDispatcher.getInstancia(); dispatcher.addEventListener(ClassDispatcher.HIDE_CONTENT,DetectEvent);
- Elimina todos los componentes previamente añadidos
Código ActionScript :
private function RemoveComponents():void{
if(temasArray!=null){
for(var i:uint; i<temasArray.length;i++){
removeChild(temasArray[i])
}
}
}//end 'RemoveComponents()
- Volvemos al frame anterior.
Explico donde viene el problema, voy del frame 1 al frame 2-> OK, vuelvo del frame 2 al frame1 -> OK, vuelvo de nuevo del frame 1 al frame 2->ERROR!!!
"ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.
at flash.display::DisplayObjectContainer/removeChild()
at myAs::TermScreen/RemoveAllComponents()"
El error se produce en la clase del frame 1 (clasePantalla1) al eliminar los componenentes. Sé que este tipo de error sucede cuando tratamos de eliminar
un componente q ya ha sido eliminado o no está en la lista de visualización...pero no acabo de ver como remediarlo. De hecho los compnentes desaparecen y
me deja continuar pero posteriormente enb otras clases q no he indicado y que mantienen este funcionamiento me surge el error y sin embargo el contenido
no desaparece superponiedose al contenido anterior...
He reducido el código al máximo para evitar mayor aburrimiento del q ya habré provocado
he intendado evitarlo al máximo, no obstante también estoy trabajando en ello para que no aparezca nada.
Qué más... sé q a veces cuando trabajamos con varios frames el código se ejecuta antes de q los elementos gráficos estén disponibles...No obstante, en mi caso
creo q es el caso inverso porque avanzamos 1 frame pero eliminamos lo del frame posterior q ya ha sido mostrado....
Sé que es algo pesado lo que comento pero necesito solucionarlo porque algo tan tonto se arrastra continuamenente. Agradezco mucho a quien tenga la paciencia de
leer hasta el final
un saludo!
