Domanda

Ho capito come creare un metodo statico disponibile ovunque, ad esempio:

UtilLib.as:

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

Posso accedervi ovunque facendo UtilLib.getTimeStamp () - Ora, voglio creare un nuovo metodo staic chiamato log (msg: String). Ciò dovrebbe registrare un messaggio in un campo di input su più righe.

Il problema tuttavia è che questo campo di input deve essere creato da qualche parte e deve essere accessibile e visibile in ogni momento, e non voglio passarlo continuamente attraverso i parametri della funzione poiché ciò causerebbe molti problemi (I dovrei passarlo anche attraverso gli oggetti ..).

Quindi, come posso fare un " campo di testo pubblico " quindi il mio metodo di registro statico può scrivergli?

UPDATE: Ora ho provato la seguente classe, con un costruttore statico (credo). Tuttavia, l'oggetto campo di testo non viene visualizzato. Quando faccio un addChild (debugField) dopo averlo creato, mi dà l'errore 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 inizializzo in questo modo:

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

E registro un nuovo messaggio come questo:

Logger.log("test");

Sfortunatamente, textField non viene visualizzato.

È stato utile?

Soluzione

In sostanza hai bisogno di:

  • da qualche parte per registrare un messaggio accessibile a livello globale
  • la possibilità di aggiornare un campo di testo ogni volta che cambia il messaggio di registro

Una semplice soluzione che utilizza oggetti potrebbe apparire così:

Esempio

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 {}

La cosa importante qui è che un messaggio può essere registrato da qualsiasi luogo usando

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

e qualsiasi cosa può essere notificata quando un messaggio è stato registrato usando

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

in qualsiasi momento è possibile ottenere il registro messaggi corrente utilizzando

MessageLogger.getInstance().getLog();

Altri suggerimenti

Crea una nuova classe di registrazione e fai in modo che quella classe abbia un costruttore statico. Aggiungi il tuo metodo di registrazione a questa classe. Fare in modo che il costruttore statico salvi il campo di registrazione in una variabile privata. Ora prima di chiamare il metodo di registrazione è sufficiente chiamare il costruttore statico con il campo di input che si desidera utilizzare. Questo creerà la classe, imposterà il campo di input come destinazione e ora puoi semplicemente chiamare la funzione log da qualsiasi luogo.

Tradizionalmente, il modo in cui permetti ai metodi statici di interagire con le variabili private è passarli. Passa un puntatore alla tua casella di testo.

quindi anziché

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

hai

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

La sintassi potrebbe non essere corretta in quanto non sono un sviluppatore di AS ma capisci cosa intendo? Da lì, quel blocco di codice può accedere a messageBox come se fosse una variabile locale. Bene lo è.

(Ho rinominato il nome del metodo per maggiore chiarezza. Potresti anche impedirlo di restituire una variabile se non è necessario, ma dovrai cambiare ulteriormente la dichiarazione.)

Nel tuo post aggiornato il campo di testo di debug deve essere aggiunto all'elenco di visualizzazione da qualche parte. In questo momento sembra che sia stato appena creato e utilizzato durante quel metodo di registro. È possibile aggiungere oggetti di visualizzazione all'elenco di visualizzazione chiamando addChild (displayObject: DisplayObject): Boolean; su un DisplayObjectContainer che è già figlio del palco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top