NSTimer 在指定的时间间隔后不会调用选择器。 iOS

Posted

技术标签:

【中文标题】NSTimer 在指定的时间间隔后不会调用选择器。 iOS【英文标题】:NSTimer does not call selector after assigned time interval. iOS 【发布时间】:2014-09-15 05:54:48 【问题描述】:

我有一个横幅数组并将其显示在我的自定义单元格中。当用户点击横幅时,我推送detailViewController 并打开应用内浏览器。

我每 5 秒更换一次横幅。为此,我使用NSTimer 来安排选择器调用。一切都很好......直到,用户点击横幅并从detailViewController回来。当用户回来时, NSTimer 的行为真的很奇怪。它在 5 秒后更改第一个横幅(按分配),然后在 1 秒后更改下一个横幅,依此类推。

她是我正在使用的代码:

#pragma mark - User Methods
-(void) resetBannerRotationTimer 
    [self.bannerTimer invalidate];
    self.bannerTimer = nil;
    self.timeInterval = 5.0f;
    self.bannerTimer = [NSTimer scheduledTimerWithTimeInterval:self.timeInterval target:self selector:@selector(rotateBanner) userInfo:nil repeats:YES];
    self.timeInterval = self.bannerTimer.timeInterval;

    [[NSRunLoop currentRunLoop] addTimer:self.bannerTimer forMode:NSRunLoopCommonModes];


旋转横幅:

-(void) rotateBanner 
    BannerCell *bannerCell = (BannerCell *)[self.dealsTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    [bannerCell updateBanner];

在我的updateBanner 方法中,我正在处理UIPageControl 以更改页面。 (我认为不需要发布代码)。

我在viewWillAppear方法中调用resetBannerRotationTimer方法。

【问题讨论】:

您的resetBannerRotationTimer 被调用了多少次?我认为你应该使用scheduledTimerWithtimeInterval。那么你就不需要在runLoop中添加定时器了。 代码看起来不错。在 resetBannerRotationTimer 方法中保留断点。查看计时器对象是否有效。在调试器窗口中使用 po [NSRunLoop currentLoop] 打印内容并验证计时器对象的属性。看看那里有没有问题。 我试过scheduledTimerWithtimeInterval,它在 5 秒和 3 秒后改变横幅。不过,时间间隔是 5 秒。 我也更新了我的resetBannerRotationTimer 方法。 得到了问题。当用户点击横幅时,我的计时器没有失效。它不应该造成问题,但它仍然存在。我在点击时将计时器设置为零并且它正在工作。 【参考方案1】:

我认为你错过了触发计时器

在定时器调度后添加这一行

[self.bannerTimer fire];

【讨论】:

-1 。我正在使用[NSRunLoop currentRunLoop],所以我不必显式地触发计时器。如果这是问题所在,那么我的选择器将永远不会调用。

以上是关于NSTimer 在指定的时间间隔后不会调用选择器。 iOS的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 NSTimer 时发送到类的无法识别的选择器; NSInvalidArgumentException

具有单独 timeleft 的多个 NSTimer

NSTimer 可以采用多个选择器吗?

从 NSTimer 函数调用 UIButton @IBAction [关闭]

NSTimer 选择器中的方法无效

NSTimer 选择器不重复