重新加载UITableView数据后,indexPathForCell返回null
Posted
技术标签:
【中文标题】重新加载UITableView数据后,indexPathForCell返回null【英文标题】:After reloading UITableView data, indexPathForCell returns null 【发布时间】:2014-03-20 06:22:11 【问题描述】:我在 ViewController 中有一个 UITableView,其中包含一个自定义单元格。 当视图第一次加载时,以下代码中的 indexPathForCell 返回 indexPath 没有问题:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
PostCell *postCell = (PostCell *)[tableView dequeueReusableCellWithIdentifier:@"PostCell"];
if (postCell == nil)
NSLog(@"EmptyCell Found");
NSDictionary *object = [postArray objectAtIndex:indexPath.row];
NSString *imageURL = [object objectForKey:@"imageURL"];
NSIndexPath *originalIndexPath = indexPath;
NSLog(@"Original IndexPath %@", originalIndexPath);
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadWithURL:[NSURL URLWithString:imageURL]
options:indexPath.row == 0 ? SDWebImageRefreshCached : 0
progress:^(NSInteger receivedSize, NSInteger expectedSize)
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
if (image)
// This returns correctly on first load
NSIndexPath *currentIndexPath = [imageTableView indexPathForCell:postCell];
NSLog(@"Current IndexPath %@", currentIndexPath);
];
刷新 tableView 后,currentIndexPath 始终为 (null)。 以下是我的刷新代码:
- (void)refreshMainView
AFHTTPRequestOperation *downloadPostOperation = [[AFHTTPRequestOperation alloc] initWithRequest:serviceRequest];
[downloadPostOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
//[tableView beginUpdates];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:urlData options:kNilOptions error:&error];
NSMutableArray *newPostArray = [json objectForKey:@"posts"];
// Replacing the old array with new array
postArray = newPostArray;
[self stopRefresh];
//[tableView endUpdates]
[imageTableView reloadData];
failure:^(AFHTTPRequestOperation *operation, NSError *error)
[self stopRefresh];
];
如果我只执行[tableView reloadData]而不执行refreshMainView,那么获取currentIndexPath不会有任何问题。
我必须忽略某些东西,有人可以帮助我吗?谢谢!
编辑:
我已经尝试[postCell.postImageView setImageWithURL:[NSURL URLWithString:imageURL] placeholderImage:nil];
并且刷新工作,所以我怀疑我在完成的块中获取 indexPath 有问题,有人可以帮忙吗?我需要完成的块,因为我正在做一些图像处理。
【问题讨论】:
在完成块中调用beginUpdates
和 endUpdates
是不必要的,因为您不插入或删除单元格。
可能是因为setCompletionBlockWithSuccess
块在填充帖子数组之前刷新您的表格视图。
嗨 Nitin,你能详细说明一下吗?我试过使用[self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:NO];
,但没有帮助。根据link,重载也在completionBlock内。
imageURL、postData、newPostArray 变量从何而来?请显示更多代码。
@HoanNguyen 嗨,我已经更新了更多代码。
【参考方案1】:
嗨,我终于修好了。
有需要的人,加一下
dispatch_async(dispatch_get_main_queue(), ^
);
在检索 indexPathForCell 的部分周围。
【讨论】:
这怎么可能发生在地球上?谢谢【参考方案2】:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
PostCell *postCell = (PostCell *)[tableView dequeueReusableCellWithIdentifier:@"PostCell"];
if (cell == nil)
nib = [[NSBundle mainBundle] loadNibNamed:@"PostCell" owner:self options:nil];
NSIndexPath *originalIndexPath = indexPath;
NSLog(@"Original IndexPath %@", originalIndexPath);
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadWithURL:[NSURL URLWithString:imageURL]
options:indexPath.row == 0 ? SDWebImageRefreshCached : 0
progress:^(NSInteger receivedSize, NSInteger expectedSize)
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
if (image)
// This returns correctly on first load
NSIndexPath *currentIndexPath = [imageTableView indexPathForCell:postCell];
NSLog(@"Current IndexPath %@", currentIndexPath);
];
使用它可能对你有帮助
【讨论】:
您好,实际上我已经在使用if (postCell == nil)
检查 nil 单元格,但它没有捕获任何内容。而且我正在使用情节提要,所以我没有笔尖。我已经更新了我的问题。
使用断点并检查 postCell 中是否有任何引用
嗨,我已经更新了我的帖子:刷新 tableView 后,我无法在已完成的块中获取 currentIndexPath,我不确定为什么会发生这种情况,因为我可以在刷新。有什么帮助吗? - 顺便说一句,postCell 有一个引用,只是 imageTableView indexPathForCell: 返回 (null)以上是关于重新加载UITableView数据后,indexPathForCell返回null的主要内容,如果未能解决你的问题,请参考以下文章
重新加载UITableView数据后,indexPathForCell返回null