0

ユーザーがアプリを 1 時間使用しているときにアラートを表示したい

アプリのデリゲートで:

最初にこれを試しました: Displaying UIAlertView after some time

それから私は試しました

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self performSelector:@selector(showAlert) withObject:nil afterDelay:3600];

return YES;
}

-(void)showAlert{
  UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!"
                                                 message:@"message!"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:nil];
  [alert show];
}

両方の例で、 のさまざまな図を使用してみましたafter delay。遅延に何を入れても、タイマーは毎回1分後に起動しますか?

更新:これは正しいコードです。デリゲートに加えてビューコントローラーのviewDidLoadにもこれを残していたため、そのメソッドも起動していました。皆さんありがとう

4

3 に答える 3

3

これがあなたのすることである場合:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    [self performSelector:@selector(showAlert) withObject:nil afterDelay:3600];

    return YES;
}

-(void)showAlert{
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!"
                                                     message:@"message!"
                                                    delegate:self
                                           cancelButtonTitle:@"Cancel"
                                           otherButtonTitles:nil];
    [alert show];
}

問題は別の場所にある必要があるため、これに対する質問を編集し、追加情報を追加する必要があります。

そうでなければ、これがあなたの答えです。

于 2012-12-20T14:10:46.390 に答える
1

コードは機能するはずです。他の場所で呼び出していないことを確認しますshowAlertか?念のため、これを試すこともできます。

  long long int anHourInNanoSec = 60*60*NSEC_PER_SEC;
  long long int anHourFromNow = dispatch_time(DISPATCH_TIME_NOW, anHourInNanoSec);

  dispatch_after(anHourFromNow, dispatch_get_current_queue(), ^{
            [self showAlert];
        });

ちなみに、アプリを1時間使用するとメソッドが起動するかどうかはわかりません。アプリがバックグラウンドに設定されている場合は、タイマーを停止する必要があります。

于 2012-12-20T14:47:27.753 に答える
1

新しい回答で申し訳ありませんが、コメント欄が短すぎます。次のようなものを試すことができます:

... .h

@property (nonatomic, assign) long long int remainingTime; @property (nonatomic, assign) BOOL deamonPaused;

... .m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {

   long long int anHourInNanoSec = 60*60*NSEC_PER_SEC;
   _remainingTime = dispatch_time(DISPATCH_TIME_NOW, anHourInNanoSec);
   _deamonPaused = NO;

   dispatch_queue_t deamonThread = dispatch_queue_create(@"deamonThread", NULL);
   dispatch_async(deamonThread, ^{
            [self launchDeamon];
        });
    dispatch_release(deamonThread);

    return YES; 
}

- (void) launchDeamon{
   while (_remainingTime > 0){
      if (!_deamonPaused)
         _remainingTime -= 5*NSEC_PER_SEC; 
      sleep(5);
   }
   [self showAlert];
}

- (void) applicationDidEnterBackground:(UIApplication *)application{
    _deamonPaused = YES; 
}

- (void) applicationWillEnterForeground:(UIApplication *)application{
   _deamonPaused = NO;
}
于 2012-12-20T16:02:06.583 に答える