【问题标题】:Feasibility for adding value to a NSTimer为 NSTimer 增加价值的可行性
【发布时间】:2012-10-18 15:57:12
【问题描述】:

我目前正在制作一个使用 NSTimer 作为基础来记录时间的应用程序。但是,如果玩家在当前问题上使用了提示或弃权,我希望惩罚增加正在进行的 NSTimer 的时间。

我的问题是,是否可以为正在进行的 NSTimer 添加更多价值? 例如,计时器在 0:23:41.2,用户按下提示/没收。我想要一个添加的功能,比如说 10 分钟。当玩家按下提示/没收时,如何制作一个功能,使计时器变为 0:33:41.2?

我尝试在 google 和 SO 上查找与 NSTimer 相关的文章,发现这个 SO 线程可能有用。 How to value for NSTimer

我想我可以将它与下面的变量交换,而不是线程中显示的经过时间。 (但如果我下面展示的例子不可行,请赐教。我很想让这个游戏成功)

-(BOOL)hintButtonPressed

.

-(void) timerFireMethod:(NSTimer *) theTimer {

        if (hintButtonPressed == true) {
            // do something to increase value
            [theTimer invalidate];
        } 
}

【问题讨论】:

    标签: objective-c nstimer


    【解决方案1】:

    即使我不会使用 NSTimer 进行倒计时,也有一种简单的方法可以将时间添加到它的 fireDate:

    [_timer setFireDate:[[_timer fireDate] dateByAddingTimeInterval:600]];
    

    这将使我的 _timer 增加 10 分钟(600 秒)。

    您的示例的最佳解决方案是为按钮创建一个操作方法,并检查该操作方法是否用户已经获得了时间奖励。

    当然你可以在 fire 方法中修改 fireDate 但我的代码行不会再次触发。

    【讨论】:

    • 我已经按照此链接apptite.be/blog/ios/sample-ios-application-stopwatch 为秒表制作了一个快速示例项目。我如何实现你的代码行` [_timer setFireDate:[[_timer fireDate] dateByAddingTimeInterval:600]]; ` ?对不起,我还是个编程新手。
    • 该应用程序无法按照上述说明运行。这是秒表而不是倒计时。但无论如何:如果你改变停止按钮的方法,你可以让它增加 10 分钟而不是停止计时器:- (IBAction)onStopPressed:(id)sender { startDate = [startDate dateByAddingTimeInterval:-600]; [startDate retain]; }
    • 谢谢。正是我想要的!简单的代码行就可以了!将尝试阅读更多关于类参考以完全理解它。再次感谢!
    【解决方案2】:

    NSTimer 不是跟踪时间的好工具。它是调度周期性动作(尤其是对时间要求不是很严格的动作)的好工具。

    您跟踪时间的方式是使用三个 ivars:最近的“计时器开始”时间、“累积时间”(即最近开始之前的时间)和“isRunning”布尔值。在任何给定时间,总时间为:

    accumulated + (now - start) * (isRunning ? 1 : 0)
    

    有了这个,您可以通过修改accumulated 轻松地增加或减少时间。而且您不需要NSTimer 来更新您的数据(这很少是一个好方法)。

    【讨论】:

    • 什么是跟踪时间的好工具?通过使用 timeCounter 方法?继续前进的那个timeCounter++ ?
    • 我明白你所说的背后的逻辑,但我还没有技术知识。我将如何做才能实现这一目标?
    【解决方案3】:

    据我所知,您不能添加、增加 NSTimer 的时间,您需要创建一个新的,并释放/使旧的无效。

    顺便说一句,如果是一个简单的计时器,你仍然可以让它变得简单

    [NSObject cancelPreviousPerformRequestsWithTarget: self]
    [self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay: incrementedTime];
    

    但是如果你执行Selector,你不能像NSTimer那样得到精确的时间信息,你只能盲目地增加时间。所以一切都取决于您的需求。

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2018-10-18
      • 2017-09-16
      • 2014-06-30
      • 1970-01-01
      • 2022-08-03
      相关资源
      最近更新 更多