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