0

[開始]をクリックすると、appDelegateのイベントタイマーが開始し、しばらくすると、タイマーが起動したときにビューを表示する必要があります。

私の問題は、タイマー起動メソッドが呼び出されたが、ナビゲーションがビューコントローラーをプッシュしないことです

-(IBAction)fakeCallCaled:(id)sender
{
      NSLog(@"FakeCall");
      fakeCallDesignViewController *fakeCallVC = [[fakeCallDesignViewController alloc]init];
      NSMutableArray *array = [[NSMutableArray alloc]init];
      [array addObjectsFromArray:navController.viewControllers];
      [array addObject:fakeCallVC];
      [navController setViewControllers:array];
      [array release];
      [fakeCallVC release];
}

このメソッドはデリゲートにあります

firstviewcontroller.mで

 -(void)eventStarted
 {
        delegate.fakecallTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(fakeCallCaled:) userInfo:nil repeats:NO];
 }

5秒後、ログに「FakeCall」が表示されますが、viewcontrollerは変更されません

私もappdelegateを押し込んでみます

  -(IBAction)fakeCallCaled:(id)sender
  {
        NSLog(@"FakeCall");
        fakeCallDesignViewController *fakeCallVC = [[fakeCallDesignViewController alloc]init];
        [self.navigationController pushViewController:fakeCallVC animated:NO];
        [fakeCallVC release];
  }

しかし、同じ結果が得られます。

4

2 に答える 2

0

このようなタスクにタイマーを使用する理由は次のとおりです。

[self performSelector:@selector(fakeCallCaled:) withObject:self afterDelay:5];
于 2012-12-22T06:00:35.643 に答える
0

これにはブロックの使用を開始できます。fakeCallCaledこの場合、メソッドはまったく必要ありません。eventStarted以下のコードをメソッドに追加するだけで動作するはずです。そして、このようにメインスレッドで UI 作業を行っていることを確認してください。

-(void)eventStarted
 {
   double delayInSeconds = 5.0;
   dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
   dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        NSLog(@"FakeCall");
        fakeCallDesignViewController *fakeCallVC = [[fakeCallDesignViewController alloc]init];
        [self.navigationController pushViewController:fakeCallVC animated:NO];
        [fakeCallVC release];
   }); 
}
于 2012-12-22T06:11:15.730 に答える