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)。但是当您继续循环中的下一个项目时,剩余时间会发生变化。所以当嵌套函数引用它时,它和你最初指定的不一样,所以只有最后一个计时器在更新。

下面的代码证明了这一点,该代码警告“3”三次。

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

如果你不知道为什么,或者如何解决它,那么我建议你多花点时间在篝火旁喝杯咖啡和一本关于 JavaScript 的好书。

于 2013-03-06T03:39:48.537 回答
0

感谢您的时间和答案。我刚刚通过自定义 CountDown 类解决了这个问题

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 回答