0

私は Appcelerator Titanium APP 開発の初心者です。このリンクのインスピレーションから、各行に独自の時間が設定されているため、TableRowView で動作するカウントダウン タイマーを作成しようとしています。そして、このクラスをカスタマイズして、時間を分と秒で表示します。

各 TableRowView に次のコードを作成して、その場でリストのカウントダウンを実行しました。

コード 1

my_timer[timer_index] = new countDown(parseInt(timer_index), parseInt(15), parseInt(50),
function() {
    remainingTime.text = ''+my_timer[timer_index].time.h + " : " + my_timer[timer_index].time.m + " : " + my_timer              [timer_index].time.s;
}, function() {
    //alert("The time is up!");
    }
);

my_timer[timer_index++].start();

my_timeは、各行のカウントダウン タイマーのすべてのインスタンスをプッシュするために使用されます。

データは XHR から取得されるため、コード スニペットのようにすべてのインスタンスを保持する配列リテラルを作成しました。

問題: このコードでアプリを実行しようとすると、「time.h未定義」などの例外が表示されます。time.hただし、コードでわかるように定義しました。

さらに、単一の配列を使用して、このクラスを複数のカウントダウンに使用できます

例えば:

my_timer[0] = new countDown(2,5,5,function(){
    somelabel1.text = my_timer[0].time.h+":"+my_timer[0].time.m+":"+my_timer[0].time.s;
})
my_timer[1] = new countDown(2,5,5,function(){
    somelabel1.text = my_timer[1].time.h+":"+my_timer[1].time.m+":"+my_timer[1].time.s;
})

上記のコードは完全に機能し、エラーはありません。しかし、このクラスをループで使用して、 Code 1のようにハードコードされた値ではなくインデックス番号を渡そうとすると、上記のように例外が表示されます。

どんな助けも非常に高く評価されます。

前もって感謝します。

TableRowViewのカウントダウンタイマーで作成したい画面

4

2 に答える 2

0

さて、私が推測しなければならなかった場合、あなたが私たちにあなたの問題の完全な例や説明さえも与えなかったので、私は推測しなければなりません...

直感的には、ネストされた関数で行うように、可変変数(remainingTime)を参照して、行を作成するためにループしているということです。ただし、ループ内の次の項目に移動すると、remainingTimeが変更されます。したがって、ネストされた関数がそれを参照する場合、最初に指定したものと同じではないため、最後のタイマーのみが更新されます。

これは、「3」を3回アラートする次のコードによって示されます。

for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        alert(i);
    }, 100);
}

理由や修正方法がわからない場合は、一杯のジョーとJavaScriptに関する優れた本を持って、火に抱きしめられる時間をもう少し過ごすことをお勧めします。

于 2013-03-06T03:39:48.537 に答える
0

お時間とご回答ありがとうございます。CountDown Class をカスタマイズしてこの問題を解決しました

var countDown = function(h, m, s, _instance_index, fn_tick, fn_end) {
        return {
            total_sec : h * 60 * 60 + m * 60 + s,
            timer : this.timer,
            instance_index : _instance_index,
            set : function(h, m, s) {
                this.total_sec = parseInt(heart) * 60 * 60 + parseInt(e) * 60 + parseInt(s);
                this.time = {
                    h : h,
                    m : m,
                    s : s
                };
                return this;
            },
            start : function() {
                var self = this;
                this.timer = setInterval(function() {
                    ///alert('running');
                    if (self.total_sec) {
                        self.total_sec--;
                        var hour = parseInt(self.total_sec / (60 * 60));
                        var min = (self.total_sec - (parseInt(hour * (60 * 60))) - (self.total_sec % 60)) / 60;

                        self.time = {
                            h : parseInt(self.total_sec / (60 * 60)),
                            m : parseInt(min),
                            s : (self.total_sec % 60)
                        };
                        fn_tick(self.time.h + ":" + self.time.m + ":" + self.time.s, self.instance_index);
                    } else {
                        self.stop();
                        fn_end();
                    }
                }, 1000);
                return this;
            },
            stop : function() {
                clearInterval(this.timer);
                this.time = {
                    h : 0,
                    m : 0,
                    s : 0
                };
                this.total_sec = 0;
                return this;
            }
        };
    };

そして、次のコードを使用してこのクラスを呼び出します。

 my_timer[items_json.Record.NEW[i].ASSIGN_QUEST_ID] = new countDown(parseInt(n[0]), parseInt(n[1]), parseInt(n[2]), items_json.Record.NEW[i].ASSIGN_QUEST_ID, function(curr_time, instance_index) {
                                        questTime[instance_index].text = 'TIME LEFT ' + curr_time;

                                    }, function() {
                                        //alert("The time is up!");
                                    });
                                    my_timer[items_json.Record.NEW[i].ASSIGN_QUEST_ID].start();
于 2013-03-06T16:24:13.733 に答える