0

我希望这是一个简单的修复,你告诉我。

我拥有的是 NSTimer 类型的 IVAR *timer 类。执行 IBAction 时,会调用包含以下代码的方法:

if (timer) timer = nil;
timer = [NSTimer timerWithTimeInterval:0.2 target:self selector:@selector(removeOverlay) userInfo:nil repeats:NO];

在同一个类中,我有一个方法:

- (void)removeOverlay {
...
}

在 0.2 秒的时间间隔后不会触发。

你可能知道这里有什么问题吗?

4

4 回答 4

2
  1. 同时确保timer实例NSTimer没有被释放。
  2. removeOverlay看起来它更新了一些用户界面。确保你在主线程上调用它。
  3. 在方法中放置一个断点removeLayout以查看它是否触发。
  4. 您没有安排计时器。替换timerWithTimeIntervalscheduledTimerWithTimeInterval

在主线程上执行代码(允许 UI 更新):

- (void)removeOverlay {
  dispatch_async(dispatch_get_main_queue(), ^{
     // update ui
  });
}

更多关于Grand Central Dispatch (GCD)

于 2013-01-07T23:25:05.707 回答
1

你需要

 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

计时器通过将调用放在运行循环中的适当点来工作。

于 2013-01-07T23:23:44.633 回答
1

由于没有人提到它,将计时器添加到运行循环的另一种方法是使用 fire 方法:

[timer fire];
于 2013-01-07T23:28:34.587 回答
0

如果它只被调用一次我会使用[self performSelector:@selector(removeOverlay) afterDelay:(seconds you want to delay the use the method removeOverlay)];

于 2013-01-07T23:23:45.443 回答