문제

예를 들어 모든 곳에서 사용할 수있는 정적 메소드를 만드는 방법을 알아 냈습니다.

Utillib.as :

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

Utillib.getTimestamp ()를 수행하여 모든 곳에 액세스 할 수 있습니다. 이제 Log (MSG : String)라는 새로운 STAIC 메소드를 만들고 싶습니다. 이것은 메시지를 멀티 라인 입력 필드에 로그인해야합니다.

그러나 문제는이 입력 필드가 어딘가에 생성되어야하며 항상 액세스 할 수 있고 볼 수 있어야하며, 항상 많은 문제를 일으킬 수 있으므로 항상 함수 매개 변수를 통해 전달하고 싶지 않습니다 (나는 가질 것입니다. 물체를 통해 전달하려면 ..).

그렇다면 정적 로그 메소드가 쓸 수 있도록 "공개 텍스트 필드"를 어떻게 만들려면 어떻게해야합니까?

업데이트:나는 이제 정적 생성자로 다음 수업을 시도했습니다 (생각합니다). 그러나 텍스트 필드 객체는 표시되지 않습니다. AddChild (Debugfield)를 작성한 후에는 오류 1180을 제공합니다.

로거

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);
        }

    }
}

나는 다음과 같이 초기화합니다.

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

그리고 나는 다음과 같은 새로운 메시지를 기록합니다.

Logger.log("test");

불행히도 텍스트 필드는 표시되지 않습니다.

도움이 되었습니까?

해결책

본질적으로 당신은 필요합니다 :

  • 전 세계적으로 액세스 할 수있는 메시지를 기록 할 곳
  • 로그 메시지가 변경 될 때마다 텍스트 필드를 업데이트하는 기능

물체를 사용하는 간단한 솔루션은 다음과 같습니다.

예시

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

여기서 중요한 것은 메시지를 어디서나 사용하여 메시지를 기록 할 수 있다는 것입니다.

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

그리고 메시지를 사용하여 로그인 한 시점에 대해 알 수있는 것은 무엇이든

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

언제라도 현재 메시지 로그는

MessageLogger.getInstance().getLog();

다른 팁

새 로깅 클래스를 만들고 해당 클래스에 정적 생성자가 있도록하십시오. 이 클래스에 로깅 방법을 추가하십시오. 정적 생성자가 벌목 필드를 개인 변수로 저장하게하십시오. 이제 로깅 방법을 호출하기 전에 사용하려는 입력 필드로 정적 생성자를 호출하십시오. 이렇게하면 클래스가 생성되고 입력 필드를 대상으로 설정하고 이제 어디서나 로그 함수를 호출 할 수 있습니다.

전통적으로, 정적 메서드가 개인 변수와 상호 작용하도록하는 방법은 전달하는 것입니다. 텍스트 상자를 포인터로 전달하십시오.

그래서 대신

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

당신은 가지고 있습니다

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

내가 Dev가 아니기 때문에 구문이 잘못 될 수 있지만, 내가 무슨 뜻인지 알 수 있습니까? 거기에서 해당 코드 블록이 액세스 할 수 있습니다 messageBox 마치 로컬 변수 인 것처럼. 글쎄요.

(명확성을 위해 메소드 이름의 이름을 바꿨습니다. 필요하지 않은 경우 변수를 반환하는 것을 중지 할 수도 있지만 선언을 더 변경해야합니다.)

업데이트 된 게시물에서 디버그 텍스트 필드는 어딘가에 디스플레이 목록에 추가해야합니다. 지금은 해당 로그 방법 중에 방금 작성되고 사용되는 것처럼 보입니다. AddChild (displayObject : displayObject) : boolean; 이미 무대의 자녀 인 displayObjectContainer에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top