2010-03-11 3 views
1

Ci-dessous est mon code, et la question est expliquée par la suite.Erreur lors de l'utilisation de "removechild"

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
        xmlns:cal="cal.*" 
        layout="absolute" 
        applicationComplete="init()"  


       xmlns:geometry="com.degrafa.geometry.*" 
       xmlns:degrafa="com.degrafa.*" 
       xmlns:paint="com.degrafa.paint.*" 
       xmlns:containers="flexlib.containers.*" 
       xmlns:flexlib_controls="flexlib.controls.*" 
       xmlns:mdi_containers="flexlib.mdi.containers.*" 
       xmlns:auto="com.hillelcoren.components.*" 
       xmlns:local="*" 
       xmlns:components="CollapsibleAccordion.*" 
       modalTransparency="0.8" 
       modalTransparencyColor="0x000000" 
       backgroundSize="100%"> 
<mx:Script> 
     <![CDATA[ 
import c7.views.components.PhotoViewer.PhotoViewer; 
      import c7.config.ServerConfig; 
      import mx.core.Application; 
      import mx.containers.*; 

      import c7.models.GlobalModel; 
private var pv_slideshow:PhotoViewer = null; 



    private function toggleFullScreen():void 
       { 
        if(stage.displayState == StageDisplayState.NORMAL) 
        {             
         this.pv_slideshow = new PhotoViewer; 
         Application.application.addChild(this.pv_slideshow); //added as top-most component to application itself      
         //set new sizes & go full-screen 
         this.pv_slideshow.x = 0; 
         this.pv_slideshow.y = 0;   
         this.pv_slideshow.width = stage.fullScreenWidth; 
         this.pv_slideshow.height = stage.fullScreenHeight; 
         try 
         { 
         stage.displayState = StageDisplayState.FULL_SCREEN; 
         } 
         catch(err:Error) 
         {      
        Alert.show(err.toString()); 
        } 
        stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenEventHandler, false, 0, true); //intentionally weak referenced   
        //refresh the display sizes & display list 
        invalidateSize(); 
        invalidateDisplayList();                
       }    
       /*else 
        stage.displayState = StageDisplayState.NORMAL;*/ 
      } 

      private function fullScreenEventHandler(event:FullScreenEvent):void 
      { 
       if (event.fullScreen) //nothing to do in case when switching to full-screen 
        return;  
       //Alert.show(pv_slideshow.width.toString()); 
       //application.removeChild(this.pv_slideshow);  
       Application.application.removeChild(pv_slideshow);  //remove the full-screen container 
       this.pv_slideshow = null; //reset    
       //refresh the display sizes & display list 
       invalidateSize(); 
       invalidateDisplayList();     
      } 

Le toggleFullScreen est tiré sur le clic d'un bouton ... et de travail tout à fait bien. Mais le problème est en "sortie". Lorsque je clique sur la touche d'échappement, fullScreenEventHandler est renvoyé et il doit supprimer le fichier pv_slideshow.

C'est là que je reçois une erreur de référence d'objet nul sur la ligne:

Application.application.removeChild(pv_slideshow);  //remove the full-screen container 

J'ai essayé d'utiliser this.pv_slideshow et d'autres choses.

Plz aidez-moi à comprendre. qu'est-ce que je fais mal et comment dois-je le faire fonctionner.

Ce message d'erreur est exacte je reçois:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::removingChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:3315] 
    at mx.core::Container/removeChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2263] 
    at index_cloud/fullScreenEventHandler()[C:\development\flex_src\index_cloud.mxml:1661] 
+0

Cela fait longtemps que je n'ai pas eu d'actionscript, mais c'est une erreur de type NullPointer. L'une ou l'autre application est nulle, Application.application est nulle ou pv_slidehow est null. Vérifiez tout cela en utilisant trace. D'un autre côté, Application.application.removeChild n'est peut-être pas le bon moyen de supprimer l'enfant, et vous devez accéder à votre composant via 'this' ou quelque chose comme ça. –

Répondre

1

Je n'utiliser Application.application non plus.

S'il vous plaît vérifiez d'abord pv_slideshow existe vraiment, vous pouvez obtenir son parent (s'il en a un) et l'enlever plus tard.

obtenir le parent

pv_slideshow.parent 

le retirer de la parent_item

parent_item.removeChild(pv_slideshow) 

Assurez-vous aussi la version de Flex que vous utilisez, vous devrez peut-être enlever avec removeElement.

0

L'utilisation architecturale prévue de Application.application est de ne pas l'utiliser comme un uiComponent ou displayObject, ou autre chose. Si vous créez un projet de bibliothèque qui effectue des calculs en fonction des propriétés de l'application ou du gestionnaire de système de l'application ou si vous avez besoin d'accéder à l'application externe à partir d'un module chargé, vous avez de bonnes raisons d'utiliser App.app.

Votre exemple n'est pas un de ces cas. Votre meilleur pari est d'ajouter votre composant à 'ceci' (tant que vous n'allez pas utiliser un conteneur "view"), et faites un this.removeChild. Cela devrait résoudre une bonne partie de vos problèmes.

Bonne chance, Jeremy

Questions connexes