我目前正在使用NSTimer作为记录时间的基础。但是,如果玩家在当前问题上使用了提示或没收,我希望对正在进行的NSTimer增加时间进行处罚。
我的问题是,是否有可能为正在进行的NSTimer增加更多价值? 例如,计时器为0:23:41.2,用户按提示/罚款。我想要一个添加的功能,比方说10分钟。当玩家按提示/没收时,如何制作一个定时器将变为0:33:41.2的功能?
我尝试在谷歌和SO上找到与NSTimer相关的文章,并遇到了这个可能有用的SO线程。 How to value for NSTimer
而不是线程中显示的经过时间,我想我可以用下面的变量交换它。 (但如果我在下面显示的例子不可行,请赐教。我真的想让这个游戏成功一个)
-(BOOL)hintButtonPressed
-(void) timerFireMethod:(NSTimer *) theTimer {
if (hintButtonPressed == true) {
// do something to increase value
[theTimer invalidate];
}
}
答案 0 :(得分:2)
NSTimer
不是跟踪时间的好工具。它是安排定期操作的好工具(特别是没有非常严格的时序要求的操作)。
跟踪时间的方式是三个ivars:最近的“计时器开始”时间,“累计时间”(最近一次开始之前的时间)和“isRunning”布尔值。在任何给定时间,总时间为:
accumulated + (now - start) * (isRunning ? 1 : 0)
通过此操作,您可以通过修改accumulated
轻松添加或减少时间。并且您不需要NSTimer
来更新您的数据(这很少是一种好方法)。
答案 1 :(得分:2)
即使我不会使用NSTimer进行倒计时,也可以通过简单的方法为其fireDate添加时间:
[_timer setFireDate:[[_timer fireDate] dateByAddingTimeInterval:600]];
这会给我的_timer增加10分钟(600秒)。
对于您的示例,最好的解决方案是为按钮创建一个操作方法,并检查该操作方法是否已经获得了时间奖励。
当然你可以在fire方法中修改fireDate,但是我的代码行不会再次触发它。
答案 2 :(得分:1)
根据我的记忆,你无法添加,增加NSTimer的时间,你需要创建一个新的,并释放/使旧的无效。
顺便说一句,如果它是一个简单的计时器,你仍然可以轻松实现
[NSObject cancelPreviousPerformRequestsWithTarget: self]
[self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay: incrementedTime];
但是如果你执行选择器,你无法获得像NSTimer这样的精确时间信息,你可以盲目增加时间。所有这些都取决于您的需求。