Como posso fazer minha estática método de registro público a escrita a um inputField?
-
20-08-2019 - |
Pergunta
Eu descobri como criar um método estático que está disponível em todos os lugares, por exemplo:
UtilLib.as:
package
{
public final class UtilLib
{
public static function getTimeStamp():uint
{
var now:Date = new Date();
return now.getTime();
}
}
}
I pode acessar esta em todos os lugares, fazendo UtilLib.getTimeStamp () - Agora, eu quero criar um novo método staic chamado log (msg: String). Isso deve registrar uma mensagem a um inputField multi-line.
O problema, porém, é que esta inputField deve ser criado em algum lugar e deve ser acessível e visível o tempo todo, e eu não quero passá-lo através dos parâmetros da função o tempo todo, pois isso poderia causar um monte de problemas (I 'd tem que passá-lo através de objetos nele assim ..).
Então, como posso fazer uma "textfield pública" para o meu método log estática pode escrever para ele?
UPDATE: Agora eu tentei o seguinte classe, com um construtor estático (eu acho). No entanto, o objeto campo de texto não está mostrando. Quando eu faço um addChild (debugField) depois de criá-la, dá-me erro 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);
}
}
}
Eu inicialize-o assim:
var test:Logger = new Logger();
addChild(test);
E eu registrar uma nova mensagem como esta:
Logger.log("test");
Infelizmente, o textField não está mostrando.
Solução
Essencialmente, você precisa:
- um lugar para registrar uma mensagem que é globalmente acessível
- a capacidade de atualizar um campo de texto sempre que as alterações de mensagens de log
Uma solução simples usando objetos poderia ser assim:
Exemplo
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 {}
O importante aqui é que uma mensagem pode ser registrada em qualquer lugar usando
MessageLogger.getInstance().log( "Your Message Here" );
e tudo pode ser notificado quando uma mensagem foi registado usando
MessageLogger.getInstance().addEventListener( MessageLogger.LOG, listenerFunction );
em qualquer ponto do log mensagem atual pode ser obtido usando
MessageLogger.getInstance().getLog();
Outras dicas
Crie uma nova classe de registo e ter essa classe tem um construtor estático. Adicione o seu método de registro para esta classe. Faça o construtor estático salvar o campo de registro para uma variável privada. Agora, antes de chamar o método de registro apenas chamar seu construtor estático com o campo de entrada que você gostaria de uso. Isto irá criar a classe, configure o campo de entrada como o destino, e agora você pode simplesmente chamar a função log de qualquer lugar.
Tradicionalmente, a maneira como você deixe métodos estáticos interagir com variáveis ??privadas é passar-los. Passe em um ponteiro para a sua caixa de texto.
então ao invés de
public static function getTimeStamp():uint { ... }
Você
public static function writeTimeStamp(messageBox):uint { ... }
A sintaxe pode estar incorreta, como eu não sou um dev AS mas, você vê o que eu quero dizer? A partir daí, esse bloco de acesso código pode messageBox
como se fosse uma variável local. Pois é.
(I renomeado o nome do método para maior clareza. Você até poderia impedi-lo de retornar uma variável se não precisa, mas você precisa de mudar mais a declaração.)
Em seu post atualizou os depuração necessidades campo de texto para ser adicionado à lista de exibição em algum lugar. Agora parece que é apenas criado e usado durante esse método de log. Você pode adicionar objetos de exibição à lista de exibição chamando addChild (DisplayObject: DisplayObject): Boolean; em um DisplayObjectContainer que já é um filho de palco.