Ошибка в использовании "removechild" - PullRequest
1 голос
/ 11 марта 2010

Ниже мой код, и вопрос объясняется после него.

 <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();                
            }

toggleFullScreen запускается одним нажатием кнопки ... и работает абсолютно нормально. Но проблема в «выходе». Когда я нажимаю ESC, запускается fullScreenEventHandler, и он должен удалить pv_slideshow.

Здесь я получаю ошибку ссылки на нулевой объект в строке:

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

Я пытался использовать this.pv_slideshow и другие подобные вещи.

Плз, помогите мне разобраться. что я делаю не так и как мне заставить это работать.

Это точное сообщение об ошибке, которое я получаю:

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]

Ответы [ 2 ]

1 голос
/ 05 июня 2011

Я бы тоже не использовал Application.application.

Пожалуйста, проверьте, действительно ли существует первое pv_slideshow, вы можете получить его родителя (если есть) и удалить его позже.

получить родителя

pv_slideshow.parent

удалите его из parent_item

parent_item.removeChild( pv_slideshow )

Убедитесь, что вы используете версию Flex, вам может потребоваться удалить ее с помощью removeElement .

0 голосов
/ 11 марта 2010

Предполагаемое архитектурное использование Application.application не должно использовать его как uiComponent или displayObject, или что-либо еще. Если вы создаете проект библиотеки, который выполняет некоторые вычисления на основе свойств приложения или systemManager приложения, или вам нужен доступ к приложению outter из загруженного модуля, то у вас есть веская причина использовать App.app. *

Ваш пример не является одним из таких случаев. Лучше всего добавить свой компонент в «this» (если вы не собираетесь использовать контейнер «view») и выполнить this.removeChild. Это должно решить большую часть ваших проблем.

Удачи, Джереми

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...