Por que minha referência de objeto é nula ao tentar fazer referência a um MX: Canvas do ActionScript?

StackOverflow https://stackoverflow.com/questions/3612553

Pergunta

Esta é uma pergunta de acompanhamento de Este, Não quero continuar nos comentários e impedir que as pessoas tenham reputação suada ... :)

Na minha classe de comando Cairngorm, para compilar, eu precisava dizer o que era mycanvas, então usei esta linha:

var myCanvas : MyCanvas = new MyCanvas;

Acho que isso está errado, porque, embora isso seja compilado, se eu tentar fazer algo assim:

if (myCanvas.subObject.value == 0) { ... }

Vai lançar este erro:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at com.foo.bar.command::MyCommand/execute()

Como se o subobjeto não existisse. Parece que eu posso estar recebendo uma nova instância de mycanvas, não a instância que eu quero do main.mxml com um id de mycanvas. Estou certo? Como faço para corrigir isso?

Editar (22:59 GMT+1): Ok, então parece que eu tenho sido muito vago aqui. Aqui está o meu main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:control="com.foo.bar.control.*" 
    xmlns:business="com.foo.bar.business.*"
    xmlns:view="com.foo.bar.view.*"
    applicationComplete="com.foo.bar.util.StartupUtil.init()"
    horizontalScrollPolicy="off"
    verticalScrollPolicy="off"
    borderThickness="0"
    paddingBottom="0"
    paddingLeft="0"
    paddingTop="0"
    paddingRight="0"
>
    <mx:Script>
        <![CDATA[
            import com.foo.bar.model.PlayerModelLocator;

            [Bindable]
            private var model : PlayerModelLocator = PlayerModelLocator.getInstance();
        ]]>
    </mx:Script>

    <!-- ========================================================================== -->

        <!-- the ServiceLocator where we specify the remote services -->
        <business:Services id="services" />

        <!-- the FrontController, containing Commands specific to this application -->
        <control:PlayerController id="controller" />

    <!-- ========================================================================== -->

  <mx:Style source="assets/main.css" />
  <view:MyCanvas id="myCanvas" /> 

</mx:Application>

E aqui está o meu com/foo/bar/command/MyCommand.as:

package com.foo.bar.command {
    /* add to controller
    addCommand( MyEvent.EVENT_CHANGE_VOLUME, ChangeVolumeCommand );
    */
    import flash.net.SharedObject;
    import com.adobe.cairngorm.control.CairngormEvent;
    import com.adobe.cairngorm.commands.ICommand;

    import com.foo.bar.model.PlayerModelLocator;
    import com.foo.bar.event.MyEvent;
    import com.foo.bar.view.*;

    public class ChangeVolumeCommand implements ICommand {
        public function execute(event:CairngormEvent):void {
      var model : PlayerModelLocator = PlayerModelLocator.getInstance();
      var myEvent : MyEvent = MyEvent(event);
      var myCanvas : MyCanvas = new MyCanvas();
      var so:SharedObject = SharedObject.getLocal("fixie.video");
      if (myCanvas.subObject.value == 0) {
        trace("subobject value is 0");
      }
        }
    }
}

Basicamente, eu quero entender o objeto com id myCanvas dentro main.mxml usando o myCanvas objeto em MyCommand.as

Foi útil?

Solução

Qual é o escopo da sua variável mycanvas? Está dentro de um método em algum lugar? Você precisará torná -lo público ou dar -lhe getter/setter para poder acessá -lo.

Você também pode estar tentando fazer referência antes de ser adicionado ao seu pai, usando o método addChild ().

Realmente não há código suficiente em seus exemplos para determinar o problema, mas essas coisas devem dar a você um lugar para começar a procurar.

Outras dicas

Pode ser algumas coisas. Primeiro, você precisa de parênteses no nome da sua classe após a declaração "nova": new MyCanvas(); Segundo, você pode estar tentando acessar seu subcomponente antes que o ciclo de vida do componente esteja pronto para você fazê -lo. (É difícil dizer pelo código que você postou, pois não há contexto suficiente.)

1 maneira é adicionar EventListener quando suas mycanvas estarão prontas após a criação e fazer todas as suas coisas

E o segundo é: defina seu SubObject Como na aula MyCanvas, você poderá acessá -la no estágio init do seu componente.

Atenciosamente Eugene

PS o tempo todo, todos querem obter resposta sem amostra bem formada de seu problema, é terrível !!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top