在我的应用中,我想限制特定UIButton(连接到动作方法)每小时按500次的次数。每次单击此按钮,都会获得一个虚拟点,我希望将用户可以获得的积分限制为500 /小时。
当达到500点限制时,我想用一条消息(一个UILabel)替换该按钮,该消息告诉用户他/她必须等待“0:XX”分钟。
我正在想象黑手党战争限制用户的方式。
我找到了这个similar thread,但它没有解释我特别想要的东西。
答案 0 :(得分:2)
如何使Array
存储您的button click
历史记录
点击该按钮后,点按Time
,然后将其添加到history array
你可以在当前Time
之前检查Time
阵列的哪个索引是500(如果不超过500,则意味着使用不应该等待。)
并计算Current Time
和500 Before Time
如果duration >= 1hour
,什么也不做
;否则duration < 1hour
,启用按钮,然后返回(1小时 - 持续时间),返回持续时间是用户必须等待
答案 1 :(得分:0)
您要做的是拥有一个NSDate
变量,当按下该按钮时,将其设置为[NSDate date]
(如果您希望它是第一次按下后的一小时,则只设置如果点击== 0)
然后你会想要一个NSTimer循环几秒钟或者你想要它准确无误,并检查[[NSDate date] timeIntervalSinceDate:firstDate]>3600
是否会重置点击次数。
答案 2 :(得分:0)
如前所述,我会在NSDate *now = [NSDate date];
在每个按钮上单击,在action方法中,您将创建一个这样的日期对象并将其添加到数组(该数组是类属性或类内部变量)。
NSMutableArray *clicksOf60Minutes; // can be initialized with alloc/initWithCapacity:501;
容量可能是550左右。做一些测试并寻找合适的价值。这是性能和内存管理的问题。无论您为初始化选择什么值,您的代码都将起作用。
添加一个(无论如何为将来的评估添加一个)之后,您将删除数组中超过60分钟的所有objectc。
do {
[clicksOf60Minutes removeObjectAtIndex:0];
} while ([[clicksOf60Minutes removeObjectAtIndex:0] timeIntervalSinceDate:firstDate]>3600]);
如果do/while
是错误的循环且while
更好,请不要对我大喊大叫。它应该是首先评估条件然后只有在条件为真时才执行循环体的那个。如果我没弄错的话,这是正确的。请仔细检查一下。
一旦完成,您的阵列将包含仅在过去60分钟内发生的点击时刻。现在检查它的号码。
if ([clicksOf60Minutes count] > 500) {
// add points
} else {
// show altert
}