【发布时间】:2011-09-01 00:07:54
【问题描述】:
每当我打电话时
reloadRowsAtIndexPaths
我的 UITableView contentOffset 被删除了,是否有一个委托方法可以用来捕获表格视图更新并再次设置偏移量,以便它保持原位并且不会在视图中设置动画,或者只是阻止它这样做?
我在 viewDidLoad 中设置 contentOffest:
self.tableView.contentOffset = CGPointMake(0, 43);
这是一个示例用法:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[params valueForKey:@"index"], nil] withRowAnimation:UITableViewRowAnimationFade];
这会删除 contentOffset 并将其动画化到视图中,这是我不想要的。
更具体地说,当正在重新加载的行位于 indexPath.section 0 和 indexPath.row 0(即顶行)时,这似乎会发生。
更多信息
我在异步请求从服务器获取图像后调用 reloadRowsAtIndexPaths。它基本上是这样工作的:
- cellForRowAtIndexPath 被调用,检查磁盘上是否存在拇指文件,如果文件不存在,则在其位置加载占位符,并在后台线程中启动异步请求以获取图像。
- 图像下载完成后,我调用
reloadRowsAtIndexPaths以获取正确的单元格,以便正确的图像淡入以代替占位符图像。 - 单元格的数量可能会有所不同,因为在 cellForRowAtIndexPath 中调用了请求,以便图像在单元格加载时加载
cellForRowAtIndexPath 文件检查
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_small.gif",[[listItems objectAtIndex:indexPath.row] valueForKey:@"slug"]]];
if([[NSFileManager defaultManager] fileExistsAtPath:path]){
listCell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:path]];
} else {
listCell.imageView.image = [UIImage imageNamed:@"small_placeholder.gif"];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[[[listItems objectAtIndex:indexPath.row] valueForKey:@"image"] valueForKey:@"small"],@"image",[NSString stringWithFormat:@"%@_small.gif",[[listItems objectAtIndex:indexPath.row] valueForKey:@"slug"]], @"name",indexPath,@"index",@"listFileComplete",@"notification",nil];
[NSThread detachNewThreadSelector:@selector(loadImages:) toTarget:self withObject:params];
[params release];
}
文件下载通知:
-(void)fileComplete:(NSNotification *)notification {
[self performSelectorOnMainThread:@selector(reloadMainThread:) withObject:[notification userInfo] waitUntilDone:NO];
}
单元格重新加载(我对部分进行了硬编码,因为一个奇怪的部分编号被传递的错误很少导致崩溃:
-(void)reloadMainThread:(NSDictionary *)params {
NSIndexPath *index;
switch ([[params valueForKey:@"index"] section]) {
case 0:
index = [NSIndexPath indexPathForRow:[[params valueForKey:@"index"] row] inSection:0];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[params valueForKey:@"index"], nil] withRowAnimation:UITableViewRowAnimationNone];
break;
default:
index = [NSIndexPath indexPathForRow:[[params valueForKey:@"index"] row] inSection:2];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:index,nil] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
【问题讨论】:
标签: iphone objective-c uitableview