web-dev-qa-db-ja.com

Xcode Objective-C | iOS:遅延機能/ NSTimerヘルプ?

だから私は最初のiOSアプリケーションを開発していますが、助けが必要です。

今の簡単なプログラムでは、約9個のボタンがあり、最初のボタンまたは任意のボタンを押すと、最初のボタンを60ミリ秒間ハイライト、ハイライト解除、2番目のボタンをハイライト、60ミリ秒待機、ハイライト解除などを行います。残りのボタンは、動くLEDのように見えます。

私はスリープ/ usleepを試したように見えましたが、そのスリープ期間が完了すると、ハイライト/ハイライトをすべて一緒にスキップするようです。

例えば:

- (void) button_circleBusy:(id)sender{
firstButton.enabled = NO;
sleep(1);
firstButton.enabled = YES;

残りのボタンについても同様です。遅延はしますが、「firstButton.enabled = NO;」は遅延しません。各ボタンの「無効状態」の写真がありますが、表示されません。

助けていただければ幸いです! NSTimerを調べましたが、どのように実装するのかわかりませんでした。

ありがとう。

-ポール

33
Retro

sleepは、メインスレッドがシステムに戻った後にのみ表示を更新できるため機能しません。 NSTimerがその方法です。これを行うには、ボタンを変更するためにタイマーによって呼び出されるメソッドを実装する必要があります。例:

- (void)button_circleBusy:(id)sender {
    firstButton.enabled = NO;
    // 60 milliseconds is .06 seconds
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];
}
- (void)goToSecondButton:(id)sender {
    firstButton.enabled = YES;
    secondButton.enabled = NO;
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToThirdButton:) userInfo:nil repeats:NO];
}
...
51
ughoavgfhw
int64_t delayInSeconds = 0.6;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     do something to the button(s)
});
47
Avner Barr

コードが少ないほど良いコードです。

[NSThread sleepForTimeInterval:0.06];

スイフト:

Thread.sleep(forTimeInterval: 0.06)
29
Alex Haas

NS

したがって、前の例を続けるとこれは

[self performSelector:@selector(goToSecondButton) withObject:nil afterDelay:.06];

詳細 ドキュメント内の情報

25
ramirogm

試してみる

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
16
Joe Völker

Avner Barrの回答を少し加えたいと思います。 int64を使用する場合、1.0の値を超えると、関数の遅延が異なるように見えます。したがって、この時点でNSTimeIntervalを使用する必要があると思います。

したがって、最終的なコードは次のとおりです。

NSTimeInterval delayInSeconds = 0.05;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

//do your tasks here

});
3
John Bassos
[NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];

使用するのに最適なものです。使用してsleep(15);ユーザーは他のアクションを実行できなくなります。次の関数を使用すると、goToSecondButtonを適切なセレクターまたはコマンドに置き換えることができます。これらのセレクターまたはコマンドは、フレームワークからも取得できます。

0
Hanson So