0

これはフラッシュの外部クラスを含む私の最初のプロジェクトなので、これはかなり基本的な質問かもしれません: クラス CSVloader に csv ファイルを読み込もうとしています:

package Application {

import flash.events.Event;
import flash.display.Loader;
import flash.filesystem.File;
import flash.net.*;

import Application.*;

public class CSVloader {
    private var waiting = true;
    private var CSVdata:Array;
    private var myCsvLoader:URLLoader = new URLLoader;
    public function CSVloader() {

    }

    public function loadCSV(Args:String){

        myCsvLoader.dataFormat = URLLoaderDataFormat.TEXT;
        myCsvLoader.load(new URLRequest(Args));
        myCsvLoader.addEventListener(Event.COMPLETE, onWait);
        return CSVdata;
    }

    public function onCSVLoaderReady():Array {
            var CSVdata:Array;
            var str:String = myCsvLoader.data as String;

            CSVdata = str.split("\n");

            for (var i:int=0; i<CSVdata.length; i++) {
              CSVdata[i] = CSVdata[i].split(';');
            }

            for(var q:int = 0; q<(CSVdata.length-1);q++){
                CSVdata[q][1] = CSVdata[q][1].slice(0,-1);
            }

            trace("CSV loaded! : " + CSVdata);
            return CSVdata;
    }


    private function onWait(e:Event):void{
        CSVdata = onCSVLoaderReady();
    }

}

}

CSVloader("some url") を呼び出すと、すべてのデータを含む配列を取得できるように、CSVloader クラスを作成するにはどうすればよいですか?

これは私の AppController クラスです:

package{
import Application.CSVloader;
import Application.C;

import flash.display.MovieClip;

public class AppController extends MovieClip{

    public function AppController() {
        // constructor code

    }

    public function init(){
        var myCSVLoader = new CSVloader();
        trace(myCSVLoader.loadCSV("data.csv"));
    }

}

}

4

1 に答える 1

0

通常の関数のように、イベント リスナーから実際にデータを返すことはできません。これは、イベント リスナーが非同期で呼び出されるためです (すぐには呼び出されません)。csv データの準備ができたら、CSVLoader からイベントをディスパッチする必要があります。

CSVLoader は、イベントをディスパッチできるように EventDispatcher を拡張する必要があります。これをインポートに追加します。

import flash.events.EventDispatcher;

CSVLoader で EventDispatcher を拡張し、csv データを保持するクラス プロパティを追加します。

public class CSVLoader extends EventDispatcher {
    public var csvData = [];
    ...

ではonCSVDataReady()、データを保持するために新しい配列を作成せず、上で宣言したプロパティを使用します。の最後でonCSVDataReady()、return ステートメントを削除し、次を追加します。

dispatch(new Event(Event.COMPLETE));

メソッド宣言の戻り値の型を void に変更することを忘れないでください。また、現在持っているすべての return ステートメントも削除する必要があります。これらは何も返さないためです。

次に、AppController で次のようにします。

private var myCSVLoader = new CSVLoader();

public function init(): void {
    myCSVLoader.addEventListener(Event.COMPLETE, completeListener);
    myCSVLoader.loadCSV("data.csv");
}

private function completeListener(evt: Event): void {
    trace(myCSVLoader.csvData);
}

理想的には、CSVLoader の csvData を非公開にし、それにアクセスする getter メソッドを作成しますが、簡潔にするためにこのようにしました。

于 2013-10-30T15:12:55.147 に答える