0

私のアプリでは、(アクション メソッドに接続されている) 特定の UIButton を 1 時間あたり 500 回に押すことができる回数を制限したいと考えています。このボタンをクリックするたびに仮想ポイントが獲得されます。ユーザーが獲得できるポイントの量を 500/時間に制限したいと考えています。

500 ポイントの制限に達したら、ボタンをメッセージ (UILabel) に置き換えて、ユーザーに「0:XX」分待たなければならないことを伝えたいと思います。

私は、マフィア ウォーズがユーザーを制限する方法に沿って何かを視覚化しています。

この類似のスレッドを見つけましたが、私が具体的に何を望んでいるのかを説明していません。

4

3 に答える 3

2

履歴Arrayを保存するを作ってみませんかbutton click

ボタンをクリックすると、クリックを取得し、Timeそれをhistory array

Time配列のどのインデックスが現在の 500 よりも前であるかを確認できますTime(500 を超えない場合は、使用を待機しないことを意味します)。

Current Timeそしてと の間の期間を計算します500 Before Time

の場合duration >= 1hourは何もしません。それ以外の場合はduration < 1hour、ボタンを有効にし、再実行 (1 時間 - 期間) の場合、戻り時間はユーザーが待機する必要があります。

于 2013-03-17T08:48:32.140 に答える
0

すでに提案したように、私は解決策を構築しますNSDate *now = [NSDate date];

ボタンがクリックされるたびに、アクション メソッド内で、このような日付オブジェクトを作成し、それを配列に追加します (配列はクラス プロパティまたはクラス内部変数です)。

NSMutableArray *clicksOf60Minutes;  // can be initialized with alloc/initWithCapacity:501;

容量は 550 かそこらになる可能性があります。いくつかのテストを行い、適切な値を探します。むしろ、パフォーマンスとメモリ管理の問題です。初期化に選択した値に関係なく、コードは機能します。

1 つ追加した後 (将来の評価のためにいずれにせよ 1 つ追加します)、配列から 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 
}
于 2013-03-17T09:45:03.800 に答える
0

あなたがしたいことは、NSDate変数を持ち、ボタンが押されたときにそれを設定すること[NSDate date]です(最初に押してから1時間にしたい場合は、クリック== 0の場合にのみ設定してください)

[[NSDate date] timeIntervalSinceDate:firstDate]>3600次に、数秒ループするか、必要に応じて正確にループし、クリック数をリセットするかどうかを確認する NSTimer が必要になります。

于 2013-03-17T08:52:45.813 に答える