我有一个带有大量图像内容的UITableView。所以滚动不再流畅。 我想添加一个计时器来加载图像,滚动时我为每一行创建计时器。如果单元退出视图,我取消定时器。如果不是我淡入图像。
我的问题是:是否有一个单元格不在视图范围内的回调?我正在阅读文档,但我不确定我的需求是什么。
感谢您的帮助!
编辑:我正在使用的代码(这是三个库,我使用的是自定义的TTTableItemCell。“_ tabBar1.tabItems = item.photos”是线路占用资源。在第一次加载时它没关系,因为照片是从服务器异步加载的,但当我向后滚动或重新加载视图时,它们都是同步加载的,并且滚动不再平滑,尤其是在iPhone 3G上。:- (void)setObject:(id)object {
if (_item != object) {
[super setObject:object];
Mission* item = object;
self.textLabel.text = item.name;
_tabBar1.tabItems = nil;
timerFeats = [NSTimer scheduledTimerWithTimeInterval:(0.5f) target:self selector:@selector(updateFeats) userInfo:nil repeats: NO];
//_tabBar1.tabItems = item.photos;
}
}
-(void)updateFeats {
DLog(@"timer ended");
Mission* item = self.object;
self._tabBar1.tabItems = item.photos;
}
答案 0 :(得分:9)
如果你正在使用iOS 6及更高版本,只需覆盖此方法:
- tableView:didEndDisplayingCell:forRowAtIndexPath:
当单元格已经离开视图时,它将被调用,并且您将获得它及其indexPath。
答案 1 :(得分:5)
好吧,我找到了办法。
实际上有一个回调可以知道哪个单元格即将脱离视野。 :
- (void)willMoveToSuperview:(UIView *)newSuperview;
所以我的代码是:
- (void)willMoveToSuperview:(UIView *)newSuperview {
[super willMoveToSuperview:newSuperview];
if(!newSuperview) {
DLog(@"timer invalidated");
if ([timerFeats isValid]) {
[timerFeats invalidate];
}
}
}
如果没有newSuperview,则单元格将退出视图,因此我首先验证我的计时器尚未失效,然后取消它。
答案 2 :(得分:1)
我建议使用KVO方法:
在awakeFromNib方法(或用于实例化单元格的任何方法)上添加以下内容:
- (void)awakeFromNib {
[self addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:nil];
...
}
确保为观察者实现委托方法,如下所示:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"hidden"]) {
NSLog(@"cell is hidden");
}
}
答案 3 :(得分:0)
最初显示UITableView
时,每行调用此方法一次
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
在此之后,当需要新行时调用该方法,这通常是滚动以显示新行并将旧视图从另一端推出的结果。
所以这是一个理想的钩子,可以找出哪些行是可见的。要检查哪些单元格可见,您可以调用
- (NSArray *)indexPathsForVisibleRows
因为tableview是唯一一个在你的单元格被回收或者刚刚创建之前对你的单元格进行引用的东西,所以你无法处理这些定时器。我建议创建NSMutableDictionary
ivar,当您创建单元格时,将计时器添加到NSMutableDictionary
[timersForIndexs setObject:yourTimer forKey:indexPath];
现在当你收到- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
时,你需要做一些像
NSMutableDictionary *tmpDictionary = [timersForIndexs copy];
[tmpDictionary removeObjectsForKeys:[self.tableView indexPathsForVisibleRows]];
NSArray *timers = [tmpDictionary allKeys];
[timers makeObjectsPerformSelector:@selector(invalidate)];
我不在xcode前面所以这是干编码所以如果您有任何问题请告诉我