Pregunta

Descubrí cómo crear un método estático que esté disponible en todas partes, por ejemplo:

UtilLib.as:

package
{   
     public final class UtilLib
     {  
          public static function getTimeStamp():uint
          {
               var now:Date = new Date();
               return now.getTime();
          }
     }
}

Puedo acceder a esto en todas partes haciendo UtilLib.getTimeStamp () - Ahora, quiero crear un nuevo método estático llamado log (msg: String). Esto debería registrar un mensaje en un campo de entrada de varias líneas.

Sin embargo, el problema es que este campo de entrada debe crearse en algún lugar y debe ser accesible y visible todo el tiempo, y no quiero pasarlo por los parámetros de la función todo el tiempo, ya que esto causaría muchos problemas (I tendría que pasarlo también por los objetos ...).

Entonces, ¿cómo hago un " public textfield " para que mi método de registro estático pueda escribirle?

ACTUALIZACIÓN: Ahora probé la siguiente clase, con un constructor estático (creo). Sin embargo, el objeto de campo de texto no se muestra. Cuando hago un addChild (debugField) después de crearlo, me da el error 1180.

Logger.as

package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldType;

    public class Logger extends Sprite
    {
        public static var debugField:TextField;

        /* static block */
        {
            trace("Logger initializing.");
            debugField = new TextField();
            debugField.width = 500;
            debugField.height = 100;
            debugField.x = 100;
            debugField.y = 400;
            debugField.background = true;
            debugField.backgroundColor = 0xFFFFFF;
            debugField.defaultTextFormat = new CustomTextFormat();
            debugField.mouseWheelEnabled = true;
            debugField.multiline = true;
            debugField.type = TextFieldType.DYNAMIC;
        }

        public static function log(msg:String):void
        {
            if (debugField) debugField.appendText(msg);
        }

    }
}

Lo inicializo así:

var test:Logger = new Logger();
addChild(test);

Y registro un nuevo mensaje como este:

Logger.log("test");

Desafortunadamente, el campo de texto no se muestra.

¿Fue útil?

Solución

Esencialmente necesitas:

  • en algún lugar para registrar un mensaje que sea accesible globalmente
  • la capacidad de actualizar un campo de texto cada vez que cambia el mensaje de registro

Una solución simple usando objetos podría verse así:

Ejemplo

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.Event;

    public class Example extends Sprite {
        private var messageLog:TextField;

        public function Example() {
            createTextField();
            MessageLogger.getInstance().addEventListener( MessageLogger.LOG, handleMessageLoggerUpdate );
            MessageLogger.getInstance().log( "Message!" );
        }

        private function handleMessageLoggerUpdate( event:Event ):void {
            messageLog.text = MessageLogger.getInstance().getLog();
        }

        private function createTextField():void {
            messageLog = new TextField();
            addChild( messageLog );
        }
    }
}

MessageLogger

package {
    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class MessageLogger extends EventDispatcher {
        private static var instance:MessageLogger;
        public static function getInstance():MessageLogger {
            if ( !instance ) {
                instance = new MessageLogger( new InstanceKey() );
            }
            return instance;
        }

        public static var LOG:String = "MessageLoader#log";

        private var messageLog:String;

        public function MessageLogger(key:InstanceKey) {
            messageLog = "";
        }

        public function log( message:String ):void {
            messageLog += message;
            notify();
        }

        public function getLog():String {
            return messageLog;
        }

        private function notify():void {
            dispatchEvent( new Event( LOG ) );
        }
    }
}
class InstanceKey {}

Lo importante aquí es que se puede registrar un mensaje desde cualquier lugar usando

MessageLogger.getInstance().log( "Your Message Here" );

y cualquier cosa puede ser notificada cuando un mensaje ha sido registrado usando

MessageLogger.getInstance().addEventListener( MessageLogger.LOG, listenerFunction );

en cualquier momento se puede obtener el registro de mensajes actual usando

MessageLogger.getInstance().getLog();

Otros consejos

Cree una nueva clase de registro y haga que esa clase tenga un constructor estático. Agregue su método de registro a esta clase. Haga que el constructor estático guarde el campo de registro en una variable privada. Ahora, antes de llamar al método de registro, simplemente llame a su constructor estático con el campo de entrada que le gustaría usar. Esto creará la clase, configurará el campo de entrada como el destino y ahora simplemente puede llamar a la función de registro desde cualquier lugar.

Tradicionalmente, la forma en que permite que los métodos estáticos interactúen con variables privadas es pasarlos. Pase un puntero a su cuadro de texto.

entonces en lugar de

public static function getTimeStamp():uint { ... }

tienes

public static function writeTimeStamp(messageBox):uint { ... }

La sintaxis puede ser incorrecta ya que no soy un desarrollador de AS pero, ¿entiendes lo que quiero decir? A partir de ahí, ese bloque de código puede acceder a messageBox como si fuera una variable local. Bueno, lo es.

(Cambié el nombre del método por claridad. Incluso podría evitar que devuelva una variable si no es necesario, pero deberá cambiar la declaración más adelante).

En su publicación actualizada, el campo de texto de depuración debe agregarse a la lista de visualización en alguna parte. En este momento parece que acaba de crearse y usarse durante ese método de registro. Agrega objetos de visualización a la lista de visualización llamando a addChild (displayObject: DisplayObject): Boolean; en un DisplayObjectContainer que ya es hijo de una etapa.

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