2013-11-23 3 views
0

Я работаю с Flash Professional IDE. Обращаясь к приведенным ниже классам, если я установил свойство класса FLA в testingsub1 (игнорируя Main), код работает нормально. Но если я задал класс Main, код умирает при stage.addChild(container); теста с «TypeError: Error # 1009: не может получить доступ к свойству или методу ссылки на нулевой объект».Почему этап не доступен в следующем примере?

Это противоречит моему пониманию того, что этап является глобальным и всегда доступен для непосредственного отображения отображаемых объектов. Любое понимание и решение?

package { 
    //import com.idtlw.iso.utils.Const; 
    import flash.display.*; 

    public class testingsub1 extends testing { 

     public function testingsub1() { 
      trace("initializing testing sub 1"); 
      var container:Sprite=new Sprite(); 

      var test1:Sprite=new Sprite(); 

      container.addChild(test1); 
     } 
    } 
} 

package { 
    import flash.display.*; 

    public class testing extends Sprite { 

     public function testing() { 
      trace("initializing testing"); 
      var container:Sprite=new Sprite(); 

      var test1:testreg1=new testreg1(); 

      container.addChild(test1); 

      stage.addChild(container); 
     } 
    } 
} 

package 
{ 

     import flash.display.*; 

     public class Main extends Sprite 
     { 
       public function Main() 
       { 
         var test1:Sprite=new Sprite(); 
         stage.addChild(test1); 

         var tester:testingsub1=new testingsub1(); 
       } 
     } 
} 
+1

«Этап» не доступен по всему миру. Свойство 'stage' объекта DisplayObject равно null, если оно не привязано к иерархии списка отображения сцены. – prototypical

+0

Я бы сказал, что - кроме основного экранного объекта - ничто не должно требовать прямого доступа к «stage». Мы говорим о компонентах, которые могут быть вложены во многие возможные ситуации; компонент не должен иметь возможность напрямую добавлять на сцену другой компонент. – poke

ответ

0

Если вы хотите жить в FlashDevelop учебники, вы найдете каверзный строку кода:

if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE,init); 

Это означает, что стадия не всегда доступна даже для главного класса. Добавьте эту строку, создайте function init(e:Event=null):void, набирая любой код, который требует доступа к этапу, и вы настроены.

О вашем вопросе заголовка - ни один класс не имеет stage, доступный в конструкторе по дизайну, даже если объект находится на стадии во время разработки и имеет собственный конструктор, вы не можете получить действительную ссылку на этап внутри этого конструктора. Свойство stage заполняется только после того, как объект был добавлен в список отображения объекта, который он заполнил, или для стадии.

+1

В этом случае я думаю, что init() должен содержать соответствие if (e! Null) removeEventListener (Event.ADDED_TO_STAGE, init); –

+0

Да, в учебниках FD говорят, что в любом случае удалить прослушиватель событий в любом случае, потому что вызов 'removeEventListener()' не делает плохих вещей, если нет соответствующего слушателя. – Vesper

0

Как уже упоминалось в его комментарии прототип, Stage является просто удобной функцией DisplayObjects и доступен только в том случае, если этот объект находится в списке отображения.

В вашем классе тестирования ctor вы получаете доступ к его объекту сцены. Это ВСЕГДА будет иметь значение null, пока оно не будет добавлено в список отображения. Вы не добавляете его до тех пор, пока ваш конструктор не закончит, следовательно, NRE. Правильный способ обработки - это зарегистрировать прослушиватель событий в вашем ctor, чтобы прослушать ADDED_TO_STAGE, а затем добавить контейнер.

Я бы сказал, однако, что ваш намеренный подход не является хорошей идеей. ДО должны, как правило, быть автономными и не обращаться к списку отображения непосредственно через этап. Практически лучше добавить контейнер в ваш тестовый класс (или просто использовать класс в качестве контейнера), и при необходимости добавьте этот класс в список отображения.

Смежные вопросы