¿Por qué mi nula referencia a un objeto cuando intentando hacer referencia a un MX: Lona de ActionScript?

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

Pregunta

Este es un seguimiento pregunta de éste , no quiero seguir adelante en los comentarios y evitar que las personas entren bien ganada reputación ...:)

En mi clase de comando Cairngorm, para que se compile que necesitaba para decirle qué era myCanvas, así que utiliza esta línea:

var myCanvas : MyCanvas = new MyCanvas;

supongo que eso está mal, sin embargo, porque a pesar de que compila, si trato de hacer algo como esto:

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

se va a lanzar este error:

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

como si no existe el subobjeto. Parece que lo debiera una nueva instancia de MiCanvas, no el ejemplo que quiero de la main.mxml con un id de myCanvas. Estoy en lo cierto? ¿Cómo puedo solucionar esto?

Editar (22:59 GMT + 1): Está bien, por lo que parece como si hubiera estado demasiado vaga aquí. Aquí está mi 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>

Y aquí está mi 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");
      }
        }
    }
}

Básicamente, quiero conseguir una manija en el objeto con ID myCanvas en main.mxml utilizando el objeto myCanvas en MyCommand.as

¿Fue útil?

Solución

¿Cuál es el alcance de la variable de myCanvas? ¿Es algún lugar dentro de un método? Tendrá que hacerlo público o darle captador / definidor para poder acceder a él.

Es posible que también esté intentando hacer referencia antes de que se ha añadido a su matriz, utilizando el método addChild ().

En realidad no hay dinero suficiente en su código de ejemplos para determinar el problema, pero son cosas que debe darle un lugar para empezar a buscar.

Otros consejos

Podría ser un par de cosas. En primer lugar, es necesario paréntesis en el nombre de la clase después de la "nueva" declaración: new MyCanvas(); segundo lugar, usted puede estar tratando de acceder a su componente secundario antes de que el ciclo de vida del componente está preparado para que lo haga. (Es difícil saber a partir del código que envió ya que no es lo suficientemente contexto.)

1 forma es añadir eventListener cuando sus myCanvas estarán listas a partir creationComplete y hacer todas sus cosas

y la segunda es: definir su subobjeto como en la clase myCanvas por lo que será capaz de acceder a él sobre inicio de la etapa de su componente.

lo que respecta Eugene

p.s. todo el tiempo a todo el mundo que desee obtener la respuesta sin muestra bien formada de su problema, su terrible !!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top